Spring Boot WebFlux响应式REST服务如何设置XML格式化输出
Spring Boot WebFlux 格式化输出XML的解决方案
方案1:自定义Jaxb2XmlEncoder(适配原生JAXB封送)
WebFlux默认使用Jaxb2XmlEncoder处理XML响应的序列化逻辑,手动构造该编码器并传入JAXB格式化属性,替换默认编码器即可生效:
- 编写配置类实现
WebFluxConfigurer接口,重写configureHttpMessageCodecs方法 - 构造
Jaxb2XmlEncoder时通过setMarshallerProperties传入JAXB_FORMATTED_OUTPUT配置
import org.springframework.context.annotation.Configuration; import org.springframework.http.codec.ServerCodecConfigurer; import org.springframework.http.codec.xml.Jaxb2XmlEncoder; import org.springframework.web.reactive.config.WebFluxConfigurer; import jakarta.xml.bind.Marshaller; import java.util.Collections; @Configuration public class WebXmlConfig implements WebFluxConfigurer { @Override public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) { Jaxb2XmlEncoder xmlFormatterEncoder = new Jaxb2XmlEncoder(); xmlFormatterEncoder.setMarshallerProperties( Collections.singletonMap(Marshaller.JAXB_FORMATTED_OUTPUT, true) ); // 替换默认XML编码器 configurer.defaultCodecs().jaxb2XmlEncoder(xmlFormatterEncoder); } }
方案2:CodecCustomizer全局注入配置(无侵入轻量方案)
不需要全量重写WebFlux配置的场景下,直接注册CodecCustomizer Bean即可实现配置注入:
import org.springframework.boot.web.codec.CodecCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.codec.xml.Jaxb2XmlEncoder; import jakarta.xml.bind.Marshaller; import java.util.Collections; @Configuration public class XmlFormatConfig { @Bean public CodecCustomizer xmlFormatCustomizer() { return configurer -> configurer.defaultCodecs().customizeDefaultCodecs(codec -> { if (codec instanceof Jaxb2XmlEncoder xmlEncoder) { xmlEncoder.setMarshallerProperties( Collections.singletonMap(Marshaller.JAXB_FORMATTED_OUTPUT, true) ); } }); } }
方案3:Jackson XML序列化场景配置
如果你的项目使用jackson-dataformat-xml而非原生JAXB做XML序列化,直接在application配置文件中添加如下配置即可:
spring: jackson: serialization: indent_output: true
注意:格式化输出会增加响应报文体积,生产环境建议关闭该配置
内容的提问来源于stack exchange,提问作者Podiki Stifado
相关产品推荐
相关产品推荐

