Spring中JAXB处理SOAP响应空字符串格式问题求助
解决方案
方案一:自定义XmlAdapter针对单个字段处理
创建自定义XmlAdapter控制空字符串的序列化逻辑:
import javax.xml.bind.annotation.adapters.XmlAdapter; public class EmptyStringElementAdapter extends XmlAdapter<String, String> { @Override public String unmarshal(String value) { return value; } @Override public String marshal(String value) { // 空字符串直接返回,强制JAXB生成<name></name>而非自闭合标签 return value; } }
在目标字段上绑定该适配器:
@XmlElement(required = true) @XmlJavaTypeAdapter(EmptyStringElementAdapter.class) protected String name;
方案二:全局配置JAXB Marshaller
如果使用JAXB RI(Sun/Oracle官方实现),可以在Spring的Jaxb2Marshaller配置中添加扩展属性,全局强制空元素输出为非自闭合格式:
import org.springframework.oxm.jaxb.Jaxb2Marshaller; import java.util.Collections; @Bean public Jaxb2Marshaller soapMarshaller() { Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); marshaller.setContextPath("com.your.service.model"); // 替换为你的JAXB上下文路径 // 设置属性改变空元素序列化规则 marshaller.setMarshallerProperties(Collections.singletonMap( "com.sun.xml.bind.marshaller.EMPTY_ELEMENT_AS_XML_ELEMENT", Boolean.TRUE )); return marshaller; }
若使用EclipseLink MOXy作为JAXB实现,替换为对应属性:
marshaller.setMarshallerProperties(Collections.singletonMap( "eclipselink.xml.empty-element-representation", "EMPTY_NODE" ));
说明:方案一仅作用于单个字段,灵活性更高;方案二全局生效,会修改所有空元素的输出格式。
内容的提问来源于stack exchange,提问作者ZDK
相关产品推荐
相关产品推荐

