如何在Spring WebFlux的WebClient中配置Jackson XML解析?
如何配置WebClient使用Jackson解析XML格式内容
我来帮你搞定这个问题!Spring WebFlux的WebClient和RestTemplate的消息处理机制不太一样——WebClient是通过ExchangeStrategies来管理消息编解码器的,而不是直接注册HttpMessageConverter。下面是适配你需求的具体方案:
核心思路
你之前在RestTemplate里用MappingJackson2XmlHttpMessageConverter处理XML,对应到WebClient里,我们需要用Jackson2XmlDecoder(处理响应解码)和Jackson2XmlEncoder(处理请求编码),并把它们配置到自定义的ExchangeStrategies中。
完整配置代码
首先,先创建适配XML的Jackson ObjectMapper(和你RestTemplate里的配置逻辑一致),然后构建编解码器并注入到WebClient:
import org.springframework.http.MediaType; import org.springframework.http.codec.xml.Jackson2XmlDecoder; import org.springframework.http.codec.xml.Jackson2XmlEncoder; import org.springframework.web.reactive.function.client.ExchangeStrategies; import org.springframework.web.reactive.function.client.WebClient; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import java.util.Arrays; // 1. 创建XML专用的ObjectMapper Jackson2ObjectMapperBuilder xmlBuilder = Jackson2ObjectMapperBuilder.xml(); // 这里可以添加自定义配置,比如忽略未知属性、设置日期格式等 ObjectMapper xmlMapper = xmlBuilder.createXmlMapper(true).build(); // 2. 自定义ExchangeStrategies,配置XML编解码器 ExchangeStrategies xmlExchangeStrategies = ExchangeStrategies.builder() .codecs(codecConfigurer -> { // 配置响应XML解码器,兼容你之前RestTemplate里的媒体类型 Jackson2XmlDecoder xmlDecoder = new Jackson2XmlDecoder(xmlMapper); xmlDecoder.setSupportedMediaTypes(Arrays.asList( MediaType.APPLICATION_XML, MediaType.TEXT_XML, MediaType.TEXT_HTML )); codecConfigurer.defaultCodecs().jackson2XmlDecoder(xmlDecoder); // 如果你的POST请求需要发送XML格式内容,就配置编码器 Jackson2XmlEncoder xmlEncoder = new Jackson2XmlEncoder(xmlMapper); xmlEncoder.setSupportedMediaTypes(Arrays.asList(MediaType.APPLICATION_XML)); codecConfigurer.defaultCodecs().jackson2XmlEncoder(xmlEncoder); }) .build(); // 3. 构建WebClient时注入自定义的ExchangeStrategies this.webClient = WebClient.builder() .baseUrl("/") .defaultHeader(...) // 保留你原来的header配置 .filter(logRequest()) // 保留原来的过滤器 .filter(logResponse()) .exchangeStrategies(xmlExchangeStrategies) // 关键:添加XML解析配置 .build();
额外说明
- 如果你只需要解析响应的XML,不需要发送XML请求,那可以去掉
Jackson2XmlEncoder的配置部分。 - 这个配置不会替换WebClient默认的JSON编解码器,只是新增了XML的支持;如果想让XML成为优先解析的格式,可以调整
setSupportedMediaTypes里的顺序。 - 和你之前RestTemplate的
MappingJackson2XmlHttpMessageConverter一样,底层都是依赖Jackson的XML模块(jackson-dataformat-xml),确保类路径里已经包含这个依赖即可。
内容的提问来源于stack exchange,提问作者membersound
相关产品推荐
相关产品推荐

