为啥@JacksonXmlProperty 使用 Kotlin 忽略 Spring Boot 中的参数?

Posted

技术标签:

【中文标题】为啥@JacksonXmlProperty 使用 Kotlin 忽略 Spring Boot 中的参数?【英文标题】:Why is @JacksonXmlProperty ignoring parameters in Spring Boot with Kotlin?为什么@JacksonXmlProperty 使用 Kotlin 忽略 Spring Boot 中的参数? 【发布时间】:2020-07-08 18:35:55 【问题描述】:

所以我尝试在 Kotlin 中使用 Jackson XML 序列化/反序列化 RSS 提要。但是,目前它没有正确执行。当我手动实例化 RSS 对象并打印出 xml 时,它似乎忽略了 @JacksonXmlProperty 中的 localNamenamespace 参数。这是我的代码:

@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 属性,不确定这是关于什么的。

【问题讨论】:

【参考方案1】:

嗯,我想通了!事实证明这是一个 Kotlin 问题。我只需要这样做:val xmlMapper = XmlMapper().registerModule(KotlinModule())

...并确保这是在您的依赖项中(我使用 gradle):

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

无论如何,我希望这对将来的某人有所帮助。

【讨论】:

以上是关于为啥@JacksonXmlProperty 使用 Kotlin 忽略 Spring Boot 中的参数?的主要内容,如果未能解决你的问题,请参考以下文章

Jackson XmlMapper 在将 XML 写入文件时强制使用小写标记名称

Jackson 将列表序列化为 xml 和 json

是否可以让Jackson ObjectMapper在Spring Boot应用程序中遵守JAXB XML注释?

java对象转xml的问题 用的是jackson-dataformat-xml.jar

为啥使用 glTranslatef?为啥不直接更改渲染坐标?

为啥或为啥不在 C++ 中使用 memset? [关闭]