将默认命名空间添加到soap body中的元素

时间:2013-03-14 14:32:45

标签: soap xsd jaxb wsdl jax-ws

我已经从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">)吗?

1 个答案:

答案 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>
   ...