Десериализация пространств имен XML с помощью Jackson & Kotlin - PullRequest
0 голосов
/ 27 мая 2019

У меня есть элемент xml с 2 пространствами имен, и я не могу прочитать их с Джексоном.

<Person xmlns="http://some.namespace.com" xmlns:ns0="http://some.other.namespace.com">
    <name>John</name>
</Person>
internal data class Person(
    val name: String,
    @get:JacksonXmlProperty(isAttribute = true)
    val xmlns: String,
    @get:JacksonXmlProperty(isAttribute = true, localName="xmlns:ns0")
    val ns0: String
)

При чтении XML с Джексоном я получаю сообщение о том, что обаПространства имен должны быть обнуляемыми.

Я пробовал с некоторыми вариантами, такими как attrs в теле класса и с атрибутом namespace, например

    @JacksonXmlProperty(isAttribute = true, localName = "ns0", namespace = "xmlns")
    var ns0: String? = null

Это картограф, который я использую

val mapper: XmlMapper = XmlMapper().apply {
        registerModule(KotlinModule())
        setSerializationInclusion(JsonInclude.Include.NON_NULL)
    }

Как я могу прочитать и снова написать этот xml и сделать их идентичными?

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Я решил свою проблему, задав свойство XMLInputFactory следующим образом:

val inputFactory = XMLInputFactory.newFactory()
inputFactory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, false)
XmlMapper(inputFactory).apply {
   registerModule(KotlinModule())
}

В этом случае вы можете смоделировать все пространства имен и делать то, что вы хотите.Дело раскрыто.

0 голосов
/ 27 мая 2019

Параметры XML xmlns="...." и xmlns:prefix="...." являются определениями пространства имен XML. Они не являются атрибутами XML, даже если они выглядят так.

Следовательно, вы не должны определять атрибуты POJO, соответствующие этим. Вместо этого вы используете параметр namespace @JacksonXmlProperty. Итак, ваш Person класс будет просто выглядеть так:

internal data class Person(
    @get: JacksonXmlProperty(isAttribute=true, localName="name", namespace="http://some.namespace.com")
    val name: String
)
...