无法在Java SoapMessage中更改envelope的soap URI

6
我正在尝试创建一个简单的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/">

请注意“应该是”部分和实际部分的xmlns:soap URI之间的差异。
如果我将addNamespaceDeclaration调用的第一个参数从“soap”更改为“soapy”,则会得到以下信封:
<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”的一部分。有什么澄清吗?
这是我的第一篇帖子,如果我问了已经解决的问题,我很抱歉,但我已经搜索了一些相关的内容,大多数都是与更改命名空间有关(例如从SOAP-ENV(默认命名空间)到soap),而不是URI本身。提前致谢。
-M
1个回答

17

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

1
谢谢您的快速回复,Erik。然而,在您发布帖子的5分钟前,我尝试过了,并且发现默认命名空间已从“SOAP-ENV”(我已更改为“soap”)更改为“env”:<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"> <env:Header/> ... </env:Envelope>我真的需要信封与我最初发布的内容匹配 - 有其他建议吗?也许我只需要构建消息,因为MessageFactory支持的两个协议都不太对... - MandM
1
前缀(例如 envsoap)没有语义意义,它只是引用命名空间的快捷方式(例如 http://www.w3.org/2003/05/soap-envelope)。 - erikxiv
很好知道,但我相信我正在通信的设备需要请求中的这些字段是那样的(我想)。 - MandM
结果发现,我正在通信的设备需要一个具有相当特定结构的信息,虽然SOAPMessage使用起来快捷而且方便,但它似乎不太灵活。最终,我选择使用Document来满足我的需求 - 它不够快,但它在结构样式方面提供了更多控制权(至少在我的经验中是这样)。我相信,如果我正在与常规的 SOAP 服务通信,那么这就是正确的答案,所以我将标记它为如此(一旦我达到15个声望分:P)。 - MandM
使用常规的SOAP服务,您不需要担心要使用哪个前缀 :) 祝您好运! - erikxiv
你可能想要实现的是创建一个SOAP 1.2消息(其命名空间与SOAP 1.1不同)。这个帮了我大忙。它让我深入了解绑定,最终成功解决了问题。非常感谢。 - Abhishek Tyagi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接