Reputation: 107
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
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