如何修改JAXB生成SOAP消息的命名空间前缀为指定的tns、idn
解决方案
方式一:修改自动生成的package-info.java(推荐,持久生效)
你首先需要先确认两个前缀对应的完整命名空间URI:
- tns前缀对应原来ns28绑定的命名空间URI,可在生成的JAXB类注解、原始WSDL/XSD文件中查询
- idn前缀对应原来ns12绑定的命名空间URI
找到JAXB生成代码所在包下的package-info.java文件,修改内容如下:
@XmlSchema( // 替换为tns对应的完整命名空间URI namespace = "http://your-tns-namespace-uri.com/xxx", xmlns = { @XmlNs(prefix = "tns", namespaceURI = "http://your-tns-namespace-uri.com/xxx"), @XmlNs(prefix = "idn", namespaceURI = "http://your-idn-namespace-uri.com/yyy") }, elementFormDefault = XmlNsForm.QUALIFIED ) package 你的JAXB类所属包名; import javax.xml.bind.annotation.XmlNs; import javax.xml.bind.annotation.XmlNsForm; import javax.xml.bind.annotation.XmlSchema;
修改后重新编译,JAXB序列化时会自动使用你指定的前缀。
方式二:运行时通过Marshaller配置前缀映射(无需修改生成代码)
如果不想改动自动生成的代码,避免下次执行wsimport/xjc时配置被覆盖,可以在序列化时自定义命名空间映射规则:
// Sun官方JAXB实现的NamespacePrefixMapper类路径为com.sun.xml.bind.marshaller.NamespacePrefixMapper,其他实现可对应调整 Marshaller marshaller = JAXBContext.newInstance(GetClientsDetailRequest.class).createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", new NamespacePrefixMapper() { @Override public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) { if ("http://your-tns-namespace-uri.com/xxx".equals(namespaceUri)) { return "tns"; } if ("http://your-idn-namespace-uri.com/yyy".equals(namespaceUri)) { return "idn"; } if ("http://www.w3.org/2001/XMLSchema-instance".equals(namespaceUri)) { return "xsi"; } return suggestion; } }); // 后续正常执行序列化操作即可
特殊说明
如果你是通过CXF、Spring WS等框架发送SOAP请求,框架本身也提供了命名空间前缀的全局配置入口,可直接在框架配置中指定前缀与命名空间的绑定规则,无需单独调整JAXB参数。
内容的提问来源于stack exchange,提问作者user2611714
相关产品推荐
相关产品推荐

