杰克逊XML冲突

时间:2018-07-03 19:10:44

标签: xml spring kotlin jackson jackson2

今天,我陷入了一个问题。我需要获取此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)

是错误还是我做错了?

当然,我可以实现它以提供新的类(例如Promotion),但是也许有更好的解决方案。

1 个答案:

答案 0 :(得分:0)

您要使用同一类中的不同Java类成员重新定义元素'i'。

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

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

对于您而言,以下结构看起来会更好:

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

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

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

包装器元素是可选的。无需包装元素即可编写相同的XML。在原始XML中是不可能的:

<promotion ... />
<banner ... />
<whatsnew ... />
<whatsnew ... />
<whatsnew ... />