【问题标题】:Jackson XML conflicting杰克逊 XML 冲突
【发布时间】:2018-12-12 04:13:57
【问题描述】:

今天我遇到了一个问题。我需要得到这个 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)来实现它,但也许有更好的解决方案。

【问题讨论】:

    标签: xml spring kotlin jackson jackson2


    【解决方案1】:

    您正在使用同一类中的不同 Java 类成员重新定义元素“i”。

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

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

    在你的情况下,下面的结构会更好看:

    <promotions>
        <promotion ... />
    </promotions>
    
    <banners>
        <banner ... />
    </banners>
    
    <whatsnews>
        <whatsnew ... />
        <whatsnew ... />
        <whatsnew ... />
        <whatsnew ... />
    </whatsnews>
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2015-04-19
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 2017-03-08
      • 2013-07-06
      相关资源
      最近更新 更多