Джексон XML конфликтует - PullRequest
0 голосов
/ 03 июля 2018

Сегодня я застрял с проблемой. Мне нужно получить это представление 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)

Это ошибка или я что-то сделал не так?

Конечно, я могу реализовать его, предоставив новый класс (например, Продвижение), но, возможно, есть лучшее решение.

1 Ответ

0 голосов
/ 03 июля 2018

Вы переопределяете элемент 'i' с разными членами класса Java в одном классе.

Предоставление разных имен для разных сущностей, безусловно, лучший подход.

Элемент XML - это не просто тег. Это объект с атрибутами и вложенными элементами (сложная структура). Лучше определять разные объекты с разными тегами.

В вашем случае следующая структура будет выглядеть лучше:

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

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

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

Элементы обертки не являются обязательными. Тот же XML может быть написан без элементов переноса. Это невозможно в вашем оригинальном XML:

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