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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 01:17:39