Spring Boot 3.2 RestClient如何正确反序列化text/xml响应
解决Spring Boot 3.2 RestClient反序列化text/xml到JAXB注解类的问题
问题根源
- 直接调用RestClient获取
PlayerModel时,默认的Jaxb2RootElementHttpMessageConverter只支持application/xml媒体类型,无法处理API返回的text/xml,因此抛出反序列化错误。 - 换成
MappingJackson2XmlHttpMessageConverter后,该转换器依赖Jackson XML模块,不识别JAXB的@XmlElement注解,导致无法映射大写的NAME字段,最终name属性为null。
最优解决方案:给JAXB转换器添加text/xml支持
既然已经使用了JAXB注解,最贴合现有代码的方案就是让RestClient的JAXB转换器兼容text/xml类型。自定义RestClient配置即可:
@Configuration public class RestClientConfig { @Bean public RestClient restClient() { return RestClient.builder() .messageConverters(converters -> { // 实例化JAXB转换器 Jaxb2RootElementHttpMessageConverter jaxbConverter = new Jaxb2RootElementHttpMessageConverter(); // 配置支持application/xml和text/xml两种类型 jaxbConverter.setSupportedMediaTypes(List.of( MediaType.APPLICATION_XML, MediaType.TEXT_XML )); // 将JAXB转换器放到最前面,确保优先处理XML响应 converters.add(0, jaxbConverter); }) .build(); } }
配置完成后,直接调用restClient.get().uri("你的API地址").retrieve().body(PlayerModel.class)就能拿到属性赋值正确的PlayerModel对象,无需再手动转字符串做反序列化。
备选方案:改用Jackson XML注解(若愿意修改实体类)
如果不想继续使用JAXB,换成Jackson的XML注解也能解决问题:
修改PlayerModel类:
@Data @AllArgsConstructor @NoArgsConstructor @JacksonXmlRootElement(localName = "Player") public class PlayerModel { @JacksonXmlProperty(localName = "NAME") private String name; }
然后配置RestClient的Jackson XML转换器支持text/xml:
@Configuration public class RestClientConfig { @Bean public RestClient restClient() { MappingJackson2XmlHttpMessageConverter jacksonXmlConverter = new MappingJackson2XmlHttpMessageConverter(); jacksonXmlConverter.setSupportedMediaTypes(List.of( MediaType.APPLICATION_XML, MediaType.TEXT_XML )); return RestClient.builder() .messageConverters(converters -> converters.add(jacksonXmlConverter)) .build(); } }
同样可以直接通过body()方法获取正确的对象。
内容的提问来源于stack exchange,提问作者Gonzalo Martinez
相关产品推荐
相关产品推荐

