Почему @JacksonXmlProperty игнорирует параметры в Spring Boot с Kotlin? - PullRequest
0 голосов
/ 28 марта 2020

Поэтому я пытаюсь сериализовать / десериализовать RSS-каналы, используя Джексона XML в Kotlin. Тем не менее, в настоящее время это не делает ни правильно. Когда я создаю экземпляр объекта RSS вручную и распечатываю xml, создается впечатление, что он игнорирует параметры localName и namespace в @JacksonXmlProperty. Вот мой код:

@JacksonXmlRootElement(localName="rss")
class RSSFeed(
    @JacksonXmlProperty(localName="channel")
    var channel: Channel
) {
    constructor() : this(Channel())
}

class Channel(
    @JacksonXmlProperty(localName="title")
    var title: String? = null,

    @JacksonXmlCData
    @JacksonXmlProperty(localName="description")
    var description: String? = null,


    @JacksonXmlProperty(localName="image")
    var image: RSSImage? = null,

    @JacksonXmlProperty(localName = "explicit", namespace="itunes")
    var isExplicit: String? = "no",

    @JacksonXmlProperty(localName = "pubDate")
    var publishDate: String? = null,

    @JacksonXmlProperty(localName = "type", namespace="itunes")
    var episodeType: String? = null,

    @JacksonXmlProperty(localName = "link", namespace="atom")
    var atomLink: AtomLink? = null,

    @JacksonXmlProperty(localName = "new-feed-url", namespace="itunes")
    var newFeedUrl: String? = null
)

Тогда я просто делаю:

println(XmlMapper().writeValueAsString(RSSFeed(Channel(title = "blah", description = "blah", image = RSSImage(url = "https://someurl.com", link = "somelink"), isExplicit = "yes", atomLink = AtomLink(href="blah.com"), newFeedUrl = "thisisthenewfeed"))))

Однако, когда я распечатываю это, он игнорирует свойства namespace и localName и просто использует имена переменных. Что я делаю не так?

Xml output: <rss><channel><title>blah</title><description><![CDATA[blah]]></description><image><url>https://someurl.com</url><title/><link><![CDATA[somelink]]></link></image><publishDate/><episodeType/><atomLink href="blah.com"/><newFeedUrl>thisisthenewfeed</newFeedUrl></channel></rss>

edit: похоже, по какой-то причине оно не печатает свойство isExplicit, не знаю, о чем идет речь.

1 Ответ

0 голосов
/ 28 марта 2020

Ну, я понял это! Оказывается, это была проблема Kotlin. Мне просто нужно было сделать это: val xmlMapper = XmlMapper().registerModule(KotlinModule())

... и убедиться, что это в ваших зависимостях (я использую gradle):

implementation("com.fasterxml.jackson.module:jackson-module-kotlin")

Anyways Я надеюсь, что это поможет кому-то в будущем.

...