Используя аннотации привязки данных к Jackson XML, как бы я десериализовал этот XML в POJO?
<result>
<items size="2">
<a>
<name>some name</name>
<detail>some text</detail>
</a>
<b>
<name>some name</name>
</b>
</items>
</result>
Я попытался использовать что-то вроде этого:
class Result {
@JacksonXmlProperty(localName = "items")
@JacksonXmlElementWrapper(useWrapping = false)
var items: List<Item> = emptyList()
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonSubTypes(JsonSubTypes.Type(name = "a", value = A::class),
JsonSubTypes.Type(name = "b", value = B::class))
abstract class Item
@JacksonXmlRootElement(localName = "a")
class A: Item() {
@JacksonXmlText(localName = "name")
var name: String? = null
@JacksonXmlText(localName = "detail")
var detail: String? = null
}
@JacksonXmlRootElement(localName = "b")
class B: Item() {
@JacksonXmlText(localName = "name")
var name: String? = null
}
Также есть мой контроллери конфигурации для ObjectMapper:
class MyController {
@RequestMapping(value = ["/result"], method = [RequestMethod.POST], consumes= [MediaType.APPLICATION_XML_VALUE])
fun postResult(@RequestBody result: Result): String {
return result.toString()
}
}
@Configuration
class ObjectMapperConfig {
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
fun objectMapper(): ObjectMapper {
return ObjectMapper()
.registerModule(KotlinModule())
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false)
.configure(DeserializationFeature.FAIL_ON_MISSING_EXTERNAL_TYPE_ID_PROPERTY, false)
}
}
Когда я пытался отправить содержимое XML на мой контроллер, я получаю следующую ошибку:
Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Could not resolve type id 'size' as a subtype of [simple type, class com.app.Item]: known type ids = [a, b] (for POJO property 'items'); nested exception is com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve type id 'size' as a subtype of [simple type, class com.app.Item]: known type ids = [a, b] (for POJO property 'items')