无法使用java SoapMessage更改信封中的soap URI

我正在尝试创建一个从客户端发送的简单SOAP消息,但我(貌似)无法更改信封中“soap”命名空间的URI。

这就是soap标题应该是这样的:

 ...  

所以我有以下代码:

  final SOAPMessage sm = MessageFactory.newInstance().createMessage(); final SOAPPart sp = sm.getSOAPPart(); final SOAPEnvelope se = sp.getEnvelope(); final SOAPHeader sh = se.getHeader(); final SOAPBody sb = se.getBody(); se.removeNamespaceDeclaration(se.getPrefix()); se.addNamespaceDeclaration("soap", "http://www.w3.org/2001/12/soap-envelope"); se.setPrefix("soap"); sb.setPrefix("soap"); sh.setPrefix("soap"); se.setEncodingStyle("http://www.w3.org/2001/12/soap-encoding/"); 

但是,当我在发送之前打印邮件时,以下是我的信封:

  

请注意“应该是”部分中的xmlns:soap的URI与实际的差异。

如果我将addNamespaceDeclaration调用的第一个参数更改为“ addNamespaceDeclaration ”而不是“soap”,这是我获得的以下信封:

  

我猜它可能与调用addNamespaceDeclaration而不是像changeNamespaceDeclaration这样的changeNamespaceDeclaration ,并且考虑到命名空间已经存在而忽略它,但我找不到changeNamespaceDeclaration东西(我已经尝试过setAttributeNS ) 。

编辑:我刚刚意识到setAttributeNS是愚蠢的,因为它改变了命名空间,而不是URI。 再次编辑:我有点困惑,因为我继续搜索,我有时会看到命名变成soap:"Namespace" ,所以在这个意义上我确实想要更改命名空间……但我认为命名空间是“肥皂“部分。 有任何澄清吗?

这是我的第一篇文章所以我道歉,如果我问的是已经解决过的东西,但我已经搜索过了,我发现的大部分内容与更改命名空间有关(比如SOAP-ENV,这是默认命名空间,而不是URI本身。 提前致谢。

-M

通常,您不需要手动修改SOAP命名空间。 您可能希望实现的是创建SOAP 1.2消息(其名称空间与SOAP 1.1不同)。 尝试从代码中删除所有命名空间更改行,并将第一行更改为

 final SOAPMessage sm = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL).createMessage(); 

如果你真的需要指定应该使用哪个前缀,这个代码似乎工作:

 SOAPMessage sm = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL).createMessage(); sm.getSOAPPart().getEnvelope().setPrefix("soap"); sm.getSOAPPart().getEnvelope().removeNamespaceDeclaration("env"); sm.getSOAPHeader().setPrefix("soap"); sm.getSOAPBody().setPrefix("soap");