为什么@JacksonXmlProperty 会忽略 Spring Boot with Kotlin 中的参数?
Why is @JacksonXmlProperty ignoring parameters in Spring Boot with Kotlin?
所以我正在尝试在 Kotlin 中使用 Jackson XML serialize/deserialize RSS 提要。但是,目前它没有正确地做任何事情。当我手动实例化 RSS 对象并打印出 xml 时,它似乎忽略了 @JacksonXml属性 中的 localName
和 namespace
参数。这是我的代码:
@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"))))
但是,当我打印出来时,它忽略了命名空间和 localName 属性,而只使用变量名。我做错了什么?
Xml 输出:<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>
编辑:由于某种原因,它似乎也没有打印 isExplicit 属性,不确定那是什么。
好吧,我想通了!事实证明这是一个 Kotlin 问题。我只需要这样做:val xmlMapper = XmlMapper().registerModule(KotlinModule())
...并确保这在您的依赖项中(我使用 gradle):
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
无论如何,我希望这对以后的人有所帮助。
所以我正在尝试在 Kotlin 中使用 Jackson XML serialize/deserialize RSS 提要。但是,目前它没有正确地做任何事情。当我手动实例化 RSS 对象并打印出 xml 时,它似乎忽略了 @JacksonXml属性 中的 localName
和 namespace
参数。这是我的代码:
@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"))))
但是,当我打印出来时,它忽略了命名空间和 localName 属性,而只使用变量名。我做错了什么?
Xml 输出:<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>
编辑:由于某种原因,它似乎也没有打印 isExplicit 属性,不确定那是什么。
好吧,我想通了!事实证明这是一个 Kotlin 问题。我只需要这样做:val xmlMapper = XmlMapper().registerModule(KotlinModule())
...并确保这在您的依赖项中(我使用 gradle):
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
无论如何,我希望这对以后的人有所帮助。