【问题标题】:How do I prevent empty complex objects when all properties are null or empty even with @JsonInclude(JsonInclude.Include.NON_EMPTY)?即使使用@JsonInclude(JsonInclude.Include.NON_EMPTY),当所有属性都为空或为空时,如何防止空复杂对象?
【发布时间】:2021-01-24 21:21:44
【问题描述】:

我有以下...

@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class Address extends ResultSetParser{
    // TODO: Need Escaped
    @JacksonXmlProperty(localName = "addressLine1")
    private String line1;
    @JacksonXmlProperty(localName = "addressLine2")
    private String line2;
    ...
}
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class Client extends ResultSetParser{
    @JacksonXmlElementWrapper(useWrapping = false)
    private Address address;
    ...
}

但是,当地址为空时,我仍然得到...

    <client>
        ...
        <address/>

为什么会这样,我该如何避免?

更新

为了明确,这是一个具有多个属性的数据库记录,如果发生这种情况,这些属性都为空。这意味着,如果不进行大量重构,就不可能添加逻辑来检查对象中的每个值(返回过程中的 100 多列)。我正在寻找某种方法来告诉它如果所有属性都为 null 而没有一些丑陋的 if 语句,则不要创建对象。

此外,在这个特定示例中,地址对象从未创建(初始化)。但是,像 Lombok 这样的框架本可以有所作为。

【问题讨论】:

    标签: java xml jackson


    【解决方案1】:

    注解@JsonInclude(JsonInclude.Include.NON_EMPTY)address字段为空时生效。确保address 没有以client.setAddress(new Address()); 的方式初始化。

    还要确保序列化是由 Jackson(例如通过 com.fasterxml.jackson.dataformat.xml.XmlMapper)而不是由 JAXB marshaller 执行的。

    【讨论】:

    • 这没有回答问题,因为我问过如何删除完全空的记录。我不能(没有广泛的逻辑)阻止从空 DB 对象创建空对象。
    • 我还确认在这种情况下我没有手动初始化任何东西。映射仅在有记录的情况下发生,在这种情况下我从未得到地址记录。所以永远不会手动创建地址对象的实例。我认为这意味着我需要否决答案,因为它没有考虑到我从未手动实例化实例的情况
    猜你喜欢
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多