Anton Shadrin
Anton Shadrin

Reputation: 107

Jackson XML conflicting

Today i got stuck with a problem. I need to get this xml view:

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

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

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

Implementation:

@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)"
    }
}

Error:

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

Is it a bug or i did smth wrong?

Of course, i can implement it providing new class (like Promotion), but maybe there is a better solution.

Upvotes: 0

Views: 464

Answers (1)

Pavel Molchanov
Pavel Molchanov

Reputation: 2409

You are re-defining element 'i' with different Java class members in the same class.

Providing different names for different entities is definitely a better approach.

XML element is not just a tag. It's an object with attributes and nested elements (complex structure). It's better to define different objects with different tags.

In your case, following structure will look better:

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

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

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

Wrapper elements are optional. The same XML can be written without wrapping elements. It is not possible in your original XML:

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

Upvotes: 1

Related Questions