Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使用java SoapMessage更改信封中的soap URI_Java_Uri - Fatal编程技术网

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

无法使用java SoapMessage更改信封中的soap URI,java,uri,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> 但是,当我在发送前打印邮件时,以下是我

我试图创建一个简单的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>
但是,当我在发送前打印邮件时,以下是我的信封:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/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

通常,您不需要手动修改SOAP名称空间。您可能想要实现的是创建一个SOAP1.2消息(它的名称空间与SOAP1.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");

谢谢你的快速回复,erik,不过我在你发帖前5分钟尝试了一下,发现默认名称空间已从“SOAP-ENV”(我已改为“SOAP”)更改为“ENV”:
我真的需要信封来匹配我最初发布的内容-还有其他建议吗?也许我只需要构建消息,因为MessageFactory支持的两个协议似乎都不太正确……前缀(例如
env
soap
)没有语义含义,它只是引用名称空间的快捷方式(例如
http://www.w3.org/2003/05/soap-envelope
)。很高兴知道,然而,我相信我正在与之通信的设备要求这些字段在请求中是那样的(我认为)。事实证明,我正在与之通信的设备需要一条具有相当特定结构的消息,尽管
SOAPMessage
使用起来又快又好,但它似乎不是很容易延展。我最终使用了
文档
来满足我的需求——虽然没有那么快,但它可以更好地控制结构样式(至少在我的经验中是这样)。我确信,如果我正在与一个常规的SOAP服务通信,那么这将是正确的答案,因此我会将其标记为正确(一旦我达到15个代表,即:P)。对于一个常规的SOAP服务,您不需要麻烦使用哪个前缀:)祝您好运!
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");