gpt4 book ai didi

java - 在 codhaus 和 fastexml 上使用 lombok 的 Jackson ObjectMapper 默认值

转载 作者:行者123 更新时间:2023-12-02 16:16:10 27 4
gpt4 key购买 nike

我正在使用 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,
}

它按预期工作,这意味着 companyRequest 已使用 users 初始化为空 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 的新版本,意思是它是启用它的功能吗?

最佳答案

Jackson 的“codehaus”版本是 Jackson 的 1.x 版本。从 2.0 开始,Jackson 位于“com.fasterxml.jackson”。在没有对其进行测试的情况下,很可能只是(有意地)在 Jackson 2 中改变了行为。

但是,正如您自己发现的那样,您可以明确建议 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;
}

关于java - 在 codhaus 和 fastexml 上使用 lombok 的 Jackson ObjectMapper 默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66653918/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com