Десериализация XML с аннотациями привязки данных Джексона в Котлине - PullRequest
0 голосов
/ 07 октября 2019

Используя аннотации привязки данных к 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')
...