iyuks 2024-05-22 11:41 采纳率: 84.3%
浏览 11

内部类作为请求参数为什么要加static

img

这个类作为请求参数时,为什么要写成静态内部类?不然以下错误


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

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-05-22 11:41
    关注

    引自免费微信小程序:皆我百晓生

    在Java中,当你将一个非静态内部类(nested class)作为方法参数、返回值类型或者字段类型时,你需要将其声明为静态(static)。这是因为非静态内部类默认具有对外部类的隐式引用,这会导致它们依赖于外部类的一个实例。然而,在JSON序列化和反序列化的过程中,Jackson库(或其他类似的库)试图无参构造一个新的对象实例,但对非静态内部类来说,它需要外部类的一个实例才能被创建。

    为了使Jackson能够正确地处理此类情况,我们需要将其转换为静态内部类。这样,静态内部类不再依赖于外部类的实例,并且可以使用无参构造函数创建对象,符合Jackson的要求。以下是修改后的代码示例:

    import jakarta.validation.constraints.*;
    
    import java.util.List;
    
    public class InnerparamParam {
    
        @NotNull(message = "id不能为空")
        private Long id;
    
        private Integer sex;
    
        @NotEmpty(message = "approvalUsers不能为空")
        private List<ApprovalUser> approvalUsers;
    
        @Valid
        @Data
        public static class ApprovalUser {
            @NotNull(message = "-id不能为空")
            private Long id;
    
            @NotBlank(message = "姓名不能为空")
            private String name;
        }
    }
    

    在这个例子中,我将ApprovalUser类声明为静态的,这样Jackson就能正确地进行反序列化了。同时,如果你使用Lombok注解,记得导入正确的包,这里我已经改成了jakarta validation约束和Lombok的@Data注解。如果你使用的是Java Bean风格的getter和setter,那么不需要额外的注解。现在,这个类应该可以作为请求参数正常工作了。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月22日