You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin数据类Jackson XML反序列化无参构造器异常问题求助

解决Kotlin数据类XML反序列化无参构造器异常问题

你遇到的核心问题其实是代码实际在使用JAXB而非你配置的Jackson XmlMapper来处理XML反序列化——这也是为什么你明明配置了支持Kotlin的Jackson模块,却还是触发了JAXB的无参构造器校验逻辑。

问题根源

你的依赖里包含了jaxb-core和jaxb-impl,而JAXB对Kotlin数据类的支持非常有限,强制要求类必须有默认无参构造器。如果你的代码中不小心调用了JAXB的反序列化API,或者在Spring环境中默认启用了JAXB的消息转换器,就会出现这个异常。

具体解决方案

1. 确保用Jackson XmlMapper执行反序列化

检查你的反序列化代码,确认是用自己配置的XmlMapper实例来处理XML,而不是JAXB的Unmarshaller:

// 正确的Jackson反序列化写法
val xmlContent = "<your-xml-string>"
val scoreTiedot = xmlMapper.readValue(xmlContent, ScoreTiedot::class.java)

彻底避免使用JAXB相关的反序列化方法。

2. Spring环境下替换默认XML消息转换器

如果是在Spring Boot/MVC中处理XML请求/响应,默认会用JAXB的消息转换器。你需要配置Spring改用Jackson的XML转换器:

@Configuration
class WebConfig : WebMvcConfigurer {
    override fun configureMessageConverters(converters: MutableList<HttpMessageConverter<*>>) {
        // 移除默认的JAXB转换器
        converters.removeIf { it is Jaxb2RootElementHttpMessageConverter }
        
        // 添加Jackson XML转换器,复用你配置好的XmlMapper
        val jacksonXmlConverter = MappingJackson2XmlHttpMessageConverter(xmlMapper())
        converters.add(jacksonXmlConverter)
    }

    @Bean
    fun xmlMapper(builder: Jackson2ObjectMapperBuilder): XmlMapper {
        return builder
            .createXmlMapper(true)
            .build()
            .registerKotlinModule()
    }
}

这样Spring就会用Jackson处理XML,自然支持Kotlin数据类的非空属性反序列化,不需要添加默认值或无参构造器。

3. 移除不必要的JAXB依赖(可选)

如果你的项目不需要JAXB的功能,可以直接移除这两个依赖,从根源避免冲突:

<!-- 删除以下JAXB依赖 -->
<!--
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-core</artifactId>
    <version>2.3.0.1</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.3.1</version>
</dependency>
-->

额外优化建议

你当前用的@XmlRootElement是JAXB注解,Jackson XML模块虽然兼容,但为了更清晰,建议替换成Jackson专属的注解:

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement

@JacksonXmlRootElement(localName = "ScoreTiedot", namespace = "http://www.xxxxxx.xxxx.xxx/calculate-score")
data class ScoreTiedot(
    @JsonProperty("MaksukykyLaskelma") val MaksukykyLaskelma: MaksukykyLaskelma,
    // ...其他属性保持不变
)

内容的提问来源于stack exchange,提问作者Madu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 07:52:52