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

如何在使用marshalSendAndReceive时去除JAXB对象XML的空格?

解决marshalSendAndReceive无法控制Marshaller属性的问题

针对你遇到的XML体积过大导致请求失败的问题,有三种可行的解决思路:

1. 手动序列化JAXB对象为紧凑XML,再发送

跳过框架自动创建Marshaller的逻辑,自己完成对象到紧凑XML的转换,再用marshalSendAndReceive的重载方法发送序列化后的内容:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import java.io.ByteArrayOutputStream;
import java.nio.charset.StandardCharsets;

// 初始化JAXB上下文
JAXBContext jaxbContext = JAXBContext.newInstance(YourJaxbEntity.class);
Marshaller marshaller = jaxbContext.createMarshaller();
// 关闭格式化输出,生成紧凑XML
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, false);

// 将对象序列化为字节流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
marshaller.marshal(yourJaxbObject, baos);
String compactXml = baos.toString(StandardCharsets.UTF_8);

// 调用重载方法发送XML字符串
Object response = webServiceTemplate.marshalSendAndReceive(endpointUrl, compactXml);

2. 配置自定义Jaxb2Marshaller替换默认实现

如果使用Spring的WebServiceTemplate,可以直接配置自定义的Jaxb2Marshaller,设置好所需属性后注入到模板中,后续所有marshalSendAndReceive调用都会使用这个配置:

import org.springframework.oxm.jaxb.Jaxb2Marshaller;
import java.util.Collections;

// 创建并配置自定义Marshaller
Jaxb2Marshaller customMarshaller = new Jaxb2Marshaller();
customMarshaller.setClassesToBeBound(YourJaxbEntity.class);
// 设置Marshaller属性,关闭格式化
customMarshaller.setMarshallerProperties(
    Collections.singletonMap(Marshaller.JAXB_FORMATTED_OUTPUT, false)
);

// 配置WebServiceTemplate使用自定义Marshaller
WebServiceTemplate webServiceTemplate = new WebServiceTemplate();
webServiceTemplate.setMarshaller(customMarshaller);
webServiceTemplate.setUnmarshaller(customMarshaller);

// 正常调用marshalSendAndReceive即可
Object response = webServiceTemplate.marshalSendAndReceive(endpointUrl, yourJaxbObject);

3. 自定义MessageConverter控制序列化逻辑

如果需要更全局的控制,可以自定义Jaxb2MessageConverter,设置Marshaller属性后添加到WebServiceTemplate的消息转换器列表中:

import org.springframework.oxm.jaxb.Jaxb2Marshaller;
import org.springframework.ws.support.MarshallingMessageConverter;

Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setClassesToBeBound(YourJaxbEntity.class);
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, false);

MarshallingMessageConverter converter = new MarshallingMessageConverter(marshaller);
webServiceTemplate.setMessageConverters(Collections.singletonList(converter));

这三种方法都能实现关闭XML格式化输出、缩小请求体积的目的,其中配置自定义Marshaller的方式最适合长期复用,手动序列化则适合临时场景快速解决问题。

内容的提问来源于stack exchange,提问作者user20066926

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 10:35:11