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

时间:2012-04-23 18:32:58

标签: java uri

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

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

<soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope/"  soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding/"> ... </soap:Envelope>

所以我有以下代码:

    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/");

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

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding/">

注意&x 34中URI的差异:&#34;应该是&#34;部分和实际。

如果我将addNamespaceDeclaration来电的第一个参数更改为&#34; soapy&#34;而不是&#34; soap&#34;,这是我得到的以下信封:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapy="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding/">

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

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

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

-M

1 个答案:

答案 0 :(得分:14)

通常,您不需要手动修改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");