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
相关产品推荐
相关产品推荐

