Java 绕过Json jackson和lombok构造函数要求

Java 绕过Json jackson和lombok构造函数要求,java,json,jackson,annotations,lombok,Java,Json,Jackson,Annotations,Lombok,使用json保存和加载数据需要json的构造函数来加载对象,而我很难让lombok注释处理这个问题。我该怎么办 这是我的类在尝试使用注释构造我的项之前和之后的样子: @Data public class Item { //before private int id; private int amount; public Item(@JsonProperty("id") int id, @JsonProperty("amount") int amount) {

使用json保存和加载数据需要json的构造函数来加载对象,而我很难让lombok注释处理这个问题。我该怎么办

这是我的类在尝试使用注释构造我的项之前和之后的样子:

@Data
public class Item { //before

    private int id;

    private int amount;

    public Item(@JsonProperty("id") int id, @JsonProperty("amount") int amount) {
        this.id = id;
        this.amount = amount;
    }

}
我不想使用lombok的NoArgsConstructor注释,因为我不想为这个类使用无参数构造函数。我意识到我可以做到这一点:

private Item() {
}

但是希望有更好的方法…

尝试将此添加到lombok配置文件中:

lombok.anyConstructor.addConstructorProperties=true
config.stopBubbling = true

因此,您的意思是Jackson不需要args构造函数来进行反序列化,您也不希望向类中添加任何args构造函数,因为这对您的模型不起作用

Lombok在这里是完全不相关的-无论是手动编写还是由Lombok生成,都没有区别,它仍然只是一个无参数构造函数

你真正的问题是-我能让Jackson在目标类上没有参数构造函数的情况下工作吗。这个问题已经有多种答案了,你几乎已经做到了。以下是必须做的事情:

  • @JsonCreator
    注释添加到构造函数中
  • @JsonProperty(“propName”)
    添加到构造函数参数

  • 你做了第二个,但没有做第一个。添加它,这将解决您的问题。

    自lombok 1.18.4以来,您可以配置复制到构造函数参数的注释。将其插入
    lombok.config

    lombok.copyableAnnotations += com.fasterxml.jackson.annotation.JsonProperty
    
    然后只需将
    @JsonProperty
    添加到字段中:

    @Data
    @AllArgsConstructor 
    public class Item {
        @JsonProperty("id")
        private int id;
    
        @JsonProperty("amount")
        private int amount;
    }
    

    尽管注释参数看起来可能不必要,但实际上它们是必需的,因为在运行时构造函数参数的名称不可用。

    尝试使用
    @allargsconstuctor(suppressConstructorProperties=true)
    @YCF\L该方法不受欢迎try
    @allargsconstuctor(onstructor=@JsonCreator))
    ,另请参见,没有比这更好的方法了吗?在第一个代码示例中,通过将构造函数参数添加到示例2中的AllArgsConstructor中,是否无法像第一个代码示例中那样使用@jsonproperty注释构造函数参数?也就是说@AllArgsConstructor(ArgumentsAnotation=@JsonProperty)非常棒,允许您使用
    final
    字段
    @Data
    @AllArgsConstructor 
    public class Item {
        @JsonProperty("id")
        private int id;
    
        @JsonProperty("amount")
        private int amount;
    }