6

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

这是肥皂标题应该是这样的:

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

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

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

<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"这样的,所以从这个意义上说,我确实想更改命名空间......但我认为命名空间是“肥皂”部分。任何澄清?

这是我的第一篇文章,所以如果我问一些已经解决的问题,我深表歉意,但我已经四处搜索,我发现的大部分内容都与更改命名空间有关(比如来自 SOAP-ENV,这是默认命名空间,到soap)而不是URI本身。提前致谢。

-M

4

1 回答 1

16

通常,您不需要手动修改 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");
于 2012-04-23T19:11:57.297 回答