如何在使用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
相关产品推荐
相关产品推荐

