微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在 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,但是对于同一个 usersmessagenull

我能够通过以下更改解决它:

@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 的更新版本{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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?