如何解决在 codhaus 和 fastexml 上使用 lombok 的 Jackson ObjectMapper 默认值
我使用 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
,但是对于同一个 users
的 message
是 null
。
我能够通过以下更改解决它:
@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
来完成它,因为 fasterxml
是 ObjectMapper
的更新版本{1}},
意思是它是一个启用它的功能吗?
解决方法
Jackson 的“codehaus”版本是 Jackson 的 1.x 版本。从 2.0 开始,Jackson 位于“com.fasterxml.jackson”。如果没有对其进行测试,很可能只是(并且有意地)在 Jackson 2 中改变了行为。
但是,正如您自己发现的那样,您可以明确建议 Jackson 在反序列化时使用 no-args 构造函数。您还可以将该注释放在 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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。