杰克逊 XML 有冲突

Jackson XML conflicting

今天我遇到了一个问题。我需要获取此 xml 视图:

<promotion>
    <i ... />
</promotion>

<promotion_banner>
    <i ... />
</promotion_banner>

<promotion_whats_new>
    <i ... />
    <i ... />
    <i ... />
    <i ... />
    <i ... />
</promotion_whats_new>

实施:

@JacksonXmlRootElement
class Response {
    @JacksonXmlProperty(isAttribute = true)
    var notAuthenticated: Boolean = false

    @get:[JacksonXmlProperty(localName = "i")
    JacksonXmlElementWrapper(localName = "promotion")]
    var promotionItems: MutableList<I> = mutableListOf()

    @get:[JacksonXmlProperty(localName = "i")
    JacksonXmlElementWrapper(localName = "promotion_banner")]
    var promotionBannerItems: MutableList<I> = mutableListOf()

    @get:[JacksonXmlProperty(localName = "i")
    JacksonXmlElementWrapper(localName = "promotion_whats_new")]
    var promotionWhatsNewItems: MutableList<I> = mutableListOf()

    @get:[JacksonXmlProperty(localName = "i")
    JacksonXmlElementWrapper(localName = "preloader")]
    var preloaderItems: MutableList<I> = mutableListOf()

    override fun toString(): String {
        return "Response(notAuthenticated=$notAuthenticated, promotionItems=$promotionItems, promotionBannerItems=$promotionBannerItems, promotionWhatsNewItems=$promotionWhatsNewItems, preloaderItems=$preloaderItems)"
    }
}

错误:

com.fasterxml.jackson.databind.JsonMappingException: Conflicting getter definitions for property "i": Response#getPromotionItems(0 params) vs Response#getPromotionBannerItems(0 params)

是bug还是我做错了?

当然,我可以提供新的class(比如促销)来实现它,但也许有更好的解决方案。

您正在用同一 class.

中的不同 Java class 成员重新定义元素 'i'

为不同的实体提供不同的名称绝对是更好的方法。

XML 元素不仅仅是一个标签。它是一个具有属性和嵌套元素(复杂结构)的对象。最好用不同的标签定义不同的对象。

对于您的情况,以下结构看起来会更好:

<promotions>
    <promotion ... />
</promotions>

<banners>
    <banner ... />
</banners>

<whatsnews>
    <whatsnew ... />
    <whatsnew ... />
    <whatsnew ... />
    <whatsnew ... />
</whatsnews>

包装器元素是可选的。同样的 XML 可以不用换行元素来写。在你原来的 XML:

中是不可能的
<promotion ... />
<banner ... />
<whatsnew ... />
<whatsnew ... />
<whatsnew ... />