杰克逊 XML 有冲突
Jackson XML conflicting
今天我遇到了一个问题。我需要获取此 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)
是bug还是我做错了?
当然,我可以提供新的class(比如促销)来实现它,但也许有更好的解决方案。
您正在用同一 class.
中的不同 Java class 成员重新定义元素 'i'
为不同的实体提供不同的名称绝对是更好的方法。
XML 元素不仅仅是一个标签。它是一个具有属性和嵌套元素(复杂结构)的对象。最好用不同的标签定义不同的对象。
对于您的情况,以下结构看起来会更好:
<promotions>
<promotion ... />
</promotions>
<banners>
<banner ... />
</banners>
<whatsnews>
<whatsnew ... />
<whatsnew ... />
<whatsnew ... />
<whatsnew ... />
</whatsnews>
包装器元素是可选的。同样的 XML 可以不用换行元素来写。在你原来的 XML:
中是不可能的
<promotion ... />
<banner ... />
<whatsnew ... />
<whatsnew ... />
<whatsnew ... />
今天我遇到了一个问题。我需要获取此 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)
是bug还是我做错了?
当然,我可以提供新的class(比如促销)来实现它,但也许有更好的解决方案。
您正在用同一 class.
中的不同 Java class 成员重新定义元素 'i'为不同的实体提供不同的名称绝对是更好的方法。
XML 元素不仅仅是一个标签。它是一个具有属性和嵌套元素(复杂结构)的对象。最好用不同的标签定义不同的对象。
对于您的情况,以下结构看起来会更好:
<promotions>
<promotion ... />
</promotions>
<banners>
<banner ... />
</banners>
<whatsnews>
<whatsnew ... />
<whatsnew ... />
<whatsnew ... />
<whatsnew ... />
</whatsnews>
包装器元素是可选的。同样的 XML 可以不用换行元素来写。在你原来的 XML:
中是不可能的<promotion ... />
<banner ... />
<whatsnew ... />
<whatsnew ... />
<whatsnew ... />