【发布时间】:2013-03-02 23:19:53
【问题描述】:
我已经从 wsdl 和 xsd 生成了一个 Web 服务客户端 (JAX-WS) 和模型。我对肥皂体内的命名空间有疑问。
假设我们有两个类:
@XmlRootElement(namespace="aNamespace") class A {
@XmlAnyElement(lax = true) Object obj;
}
@XmlRootElement(namespace="bNamespace") class B {...}
我要发送的对象是'a':
A a = new A();
a.obj = new B();
我调用的服务需要 V1 或 V3 请求:
V1
...
<soapenv:Body>
<A xmlns="aNamespace">
<B xmlns="bNamespace">
<B1>...</B1>
<B2>...</B2>
</B>
</A>
</soapenv:Body>
...
V3
...
<soapenv:Body>
<a:A xmlns:a="aNamespace">
<b:B xmlns:b="bNamespace">
<b:B1>...</b:B1>
<b:B2>...</b:B2>
</b:B>
</a:A>
</soapenv:Body>
...
尝试调用服务,我看到生成了以下请求:
V2
...
<soapenv:Body>
<a:A xmlns:a="aNamespace", xmlns:b="bNamespace">
<b:B>
<b:B1>...</b:B1>
<b:B2>...</b:B2>
</b:B>
</a:A>
</soapenv:Body>
...
并且服务返回错误。
我能否以某种方式将默认命名空间设置为 B(以便我看到 <B xmlns="bNamespace">)?
【问题讨论】:
-
在这里查看我的答案:stackoverflow.com/questions/5720501/…
-
出于好奇,当您说
The service I am calling expects following model时,它的真正含义是什么?两个 XML 都反映了同样的事情。命名空间后缀(或默认)的选择在设计上是不受约束的;命名空间感知 XML 处理器必须不关心前缀的选择。您的实现是使用自制的 XML 解析器还是旧的解析器(您能分享一下可能是哪一个),还是开发人员对如何处理 XML 的简单误解?虽然我知道您可能可以对此做点什么,但无所作为会产生丑陋的遗留代码。 -
嘿Petru,我无权访问Web服务的实现,所以我不清楚约束。我希望该服务能够提取 B 元素并在没有 A 元素信息的情况下对其进行处理。但这只是一个猜测。我能够提交变体 1 和 3,但在 2 上失败了。我还要提一下,我知道所有 3 都应该被认为是相同的。假设这是 web-service 的限制,你有什么解决方案?
-
Blaise,感谢您提供可能的解决方案,您知道如何将其注入 JAX-WS 吗?
-
@Denis - 我不确定你能做到,无论如何都不容易。这两个文档在它们的命名空间限定上是等价的。他们真的需要使用仅默认命名空间的方法吗?