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

Problem Jackson deserialization of JSON and Lombok constructor

我的 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;
    }

text-Class是这样的:


    @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-class 的构造函数有关,但我不确定为什么 - 因为我是通过 Lombok 提供构造函数的。

我使用的 JSON 看起来像这样:


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

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

感谢任何意见!

您缺少@NoArgsConstructor。

@NoArgsConstructor
public class Text {
   ...
}

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