【问题标题】:Problem Jackson deserialization of JSON and Lombok constructorJSON和Lombok构造函数的问题Jackson反序列化
【发布时间】:2021-06-29 12:48:37
【问题描述】:

我的 Dto 的 Jackson 反序列化有问题。我正在使用 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])

我知道这与我的 Text 类的构造函数有关,但我不确定为什么 - 因为我通过 Lombok 提供构造函数。

我使用的 JSON 如下所示:


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

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

感谢您的任何意见!

【问题讨论】:

    标签: java json jackson deserialization lombok


    【解决方案1】:

    您缺少@NoArgsConstructor。

    @NoArgsConstructor
    public class Text {
       ...
    }
    

    【讨论】:

    • 谢谢,但是这样 staticConstructor 不再工作了。不过我还是有点需要。尽管有 NoArgsConstructor,有没有办法允许它?
    • 静态构造函数将提供一个私有构造函数,NoArgsConstructor 将提供一个公共构造函数。您必须有一个公共构造函数才能使用 Jackson。
    【解决方案2】:

    当您使用@data 时,您将包括@Getter@Setter@ToString@EqualsAndHashCode@RequiredArgsConstructor,因为杰克逊需要反序列化默认构造函数,您应该添加@NoArgsConstructor。

    【讨论】:

      猜你喜欢
      • 2019-02-11
      • 2019-08-14
      • 2018-05-15
      • 2020-09-06
      • 1970-01-01
      • 2017-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多