记录一下自己的傻瓜bug日常。

今天在写controller接收vo时,为了懒得新建一个类文件直接在用于接收请求的vo类中写多了一个内部类用于接收额外的对象信息。在调试过程中出现无法对json对象的转换接收,报了一个实例化失败错误

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `InoutFeeCreateByTemplateVo$Affiliate`:non-static inner classes like this can only by instantiated using default, no-argument constructor.

 

错误信息也是很明显了,我的内部类少了static关键字修饰,不能通过静态创建所以导致实例化失败。

将内部类声明为public static class即可。

示例:

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.util.List;

/**
 * @author hyperion
 * @date 2021/11/11 19:40
 * <p>
 * 模板生成费用单请求体
 */
@Data
public class InoutFeeCreateByTemplateVo {

    @ApiModelProperty(value = "总公司编号", required = true)
    @NotBlank
    private String parentCompCode;

    @ApiModelProperty(value = "关联方类型 1:供应商 2:客户", required = true)
    @NotBlank(message = "关联方类型不能为空")
    private String affiliateType;

    @ApiModelProperty(value = "开单日期", required = true)
    @Size(max = 10, message = "开单日期长度不能大于10")
    @NotBlank(message = "开单日期不能为空")
    private String billingDate;

    @ApiModelProperty(value = "费用模板id", required = true)
    @NotBlank(message = "费用模板id不能为空")
    private String templateId;

    @ApiModelProperty(value = "关联方数组", required = true)
    @Size(min = 1, message = "关联方数组长度不能小于1")
    @Valid
    private List<Affiliate> affiliateIdList;

    @Data
    public static class Affiliate {

        @ApiModelProperty(value = "关联方id")
        @NotBlank(message = "关联方id不能为空")
        String affiliateId;

        @ApiModelProperty(value = "关联方名称")
        @NotBlank(message = "关联方名称不能为空")
        String affiliateName;
    }
}

ps:@Data 是lombok的引用,省去了getter,setter

内部类的实例化是通过外部类对内部类实例,即Demo.new InnerDemo(); 或者重写一下外部类的构造方法,增加内部类的实例化。