Java使用javax.xml.soap如何强制SOAP元素添加空命名空间xmlns=""
解决方法
你可以通过主动调用SOAPElement的addNamespaceDeclaration方法强制显式声明空命名空间,SAAJ默认不会输出和父元素上下文等效的命名空间声明,手动添加后会强制序列化到报文中。
修改后核心代码
MessageFactory messageFactory = MessageFactory.newInstance(); SOAPMessage soapMessage = messageFactory.createMessage(); ... QName bodyName = new QName("http://example.com", "GetAircraftDueListItems"); SOAPElement soapBodyElement = soapBody.addBodyElement(bodyName); QName qName = new QName("", "oCar"); SOAPElement carElement = soapBodyElement.addChildElement(qName); // 新增下面这行,强制声明空默认命名空间 carElement.addNamespaceDeclaration("", "");
额外兼容方案
如果部分JDK内置的SAAJ实现仍然省略该声明,可以在输出SOAP报文时通过Transformer配置强制输出所有命名空间:
TransformerFactory tf = TransformerFactory.newInstance(); Transformer transformer = tf.newTransformer(); transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty("http://xml.apache.org/xalan/indent-amount", "2"); DOMSource source = new DOMSource(soapMessage.getSOAPPart()); StringWriter sw = new StringWriter(); StreamResult result = new StreamResult(sw); transformer.transform(source, result); String soapXml = sw.toString();
修改后生成的报文会自动携带<oCar xmlns="">属性,满足服务端的命名空间校验要求。
内容的提问来源于stack exchange,提问作者Edward Gilmore
相关产品推荐
相关产品推荐

