有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JSON和Lombok构造函数的java问题Jackson反序列化

杰克逊对我的Dto反序列化有问题。我使用的是Lombok 1.18.16和Jackson(Jackson databind)2.11.3

我的课程是这样的:


    @Data
    public class Dto {
    
        @JsonProperty("ID")
        private Long id;
    
        @JsonProperty("STATUS")
        private Long status 
    
        @JsonProperty("CONTACT_ID")
        private Long contactId;
    
        @JsonProperty("TITLES")
        private List<Text> titles;
    
        @JsonProperty("DESCRIPTIONS")
        private List<Text> descriptions;
    }

文本类是这样的:


    @Data(staticConstructor = "of")
    public class Text {
    
        @JsonProperty("ID")
        private final Long id;
    
        @JsonProperty("LABEL")
        private final String label;
    }

当Jackson解析这个时,我得到一个异常,声明如下:

Cannot construct instance of `com.mycompany.Text` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
 at [Source: (org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream); line: 35, column: 13] (through reference chain: com.mycompany.Dto["TITLES"]->java.util.ArrayList[0])

我理解这与我的文本类的构造函数有关,但我不确定为什么——因为我是通过Lombok提供构造函数的

我使用的JSON如下所示:


    {
        "ID": "1",
        "STATUS": "1",
        "CONTACT_ID": "1",
        "TITLES": [
            {
                "ID": 215,
                "LABEL": "Title"
            }
        ],
        "DESCRIPTIONS": [
            { "ID":"0", "LABEL":"Description" }
        ]
    
    }

我错过了什么?还有,有没有办法使用Lombok为构造函数创建可选参数?当我想创建一个新的标题时(那么id还不存在),就会出现这种情况

谢谢大家的意见


共 (2) 个答案

  1. # 1 楼答案

    当您使用@data时,您包括@Getter@Setter@ToString@EqualsAndHashCode@RequiredArgsConstructor,因为jackson需要反序列化默认构造函数,所以您应该添加@noargsconstuctor

  2. # 2 楼答案

    您缺少@noargsconstuctor

    @NoArgsConstructor
    public class Text {
       ...
    }