Jackson ObjectMapper默认值,在codhaus和fasterexml上使用lombok

35g0bw71  于 2022-11-09  发布在  其他
关注(0)|答案(2)|浏览(78)

我使用org.codehaus.jackson.map.ObjectMapper反序列化一个JSON字符串,默认值如下:
我有以下POJO:

@Data
@Builder
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
public class CompanyRequest {
    @Builder.Default
    private String email = "";
    private int company;
    @Builder.Default
    List<UserIdMapping> users = new ArrayList<>();
}

以及执行以下操作时:

CompanyRequest companyRequest = objectMapper.readValue(message, CompanyRequest.class);

其中消息为:

{
  "email": "john@doe.com",
  "company": 42,
}

它如预期的那样工作,意味着用userscompanyRequest初始化为空ArrayList
然后我切换到com.fasterxml.jackson.databind.ObjectMapper,但是相同的messageusersnull
我可以通过以下更改解决该问题:

@Data
@EqualsAndHashCode
@Builder
public class CompanyRequest {
    private String email;
    private int company;
    private List<UserIdMapping> users;

    @JsonCreator
    public CompanyRequest() {
        this.email = "";
        this.users = new ArrayList<>();
    }

    @Builder
    public CompanyRequest(String email, int company, List<UserIdMapping> users) {
        this.sfAccountId = StringUtils.isEmpty(email) ? "" : email;
        this.company = company;
        this.users = CollectionUtils.isEmpty(users) ? new ArrayList<>() : users;
    }
}

但是在知道codehaus实际上在没有这种操作的情况下也能正常工作之后,我想知道是否有更干净的方法来处理fasterxml,因为fasterxmlObjectMapper的更新版本,这意味着它是一个支持它的特性吗?

zpjtge22

zpjtge221#

“codehaus”版本的Jackson是1. x版本的Jackson,从2. 0开始,Jackson位于“com.fasterxml.jackson”,在没有测试过的情况下,很有可能行为只是简单地(并且是故意地)随着Jackson2而改变。
但是,正如您自己所发现的,您可以明确建议Jackson在反序列化时使用无参数构造函数。您还可以将该注解放在lombok生成的构造函数上,这样就不必手动编写它:

@Data
@Builder
@EqualsAndHashCode
@NoArgsConstructor(onConstructor_ = @JsonCreator)
@AllArgsConstructor
public class CompanyRequest {
    @Builder.Default
    private String email = "";
    private int company;
    @Builder.Default
    List<UserIdMapping> users = new ArrayList<>();
}

请确保至少使用Lombok v1.18.2,以便确保在此构造函数中也设置了@Builder.Default值。
如果你希望不变性和构建器是创建示例的唯一方法(至少在Lombok v1.18.16中),考虑在类上放置@Jacksonized @Builder

@Jacksonized
@Builder
@Value
public class CompanyRequest {
    @Builder.Default
    private String email = "";
    private int company;
    @Singular
    List<UserIdMapping> users;
}
ttygqcqt

ttygqcqt2#

使用lombok提供的@Jacksonized注解

相关问题