我已经从wsdl和xsd生成了一个Web服务客户端(JAX-WS)和模型。我在soap body中的命名空间有问题。
让我们假设我们有两个类:
@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">
)吗?
答案 0 :(得分:0)
我通过将B编组到DOM对象中解决了这个问题。然后我将创建的DOM放入A.
B b = new B();
Document bDocument = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
JAXBContext.newInstance(B.class).createMarshaller().marshal(b, bDocument);
A a = new A();
a.obj = bDocument;
它会产生一些奇怪的结果,但Web服务会接受它:
...
<soapenv:Body>
<a:A xmlns:a="aNamespace" xmlns:ab="bNamespace">
<b:B xmlns:b="bNamespace">
<b:B1>...</b:B1>
<b:B2>...</b:B2>
</b:B>
</a:A>
</soapenv:Body>
...