1

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

4

1 回答 1

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;

它会产生一些奇怪的结果,但是网络服务接受它:

   ...
   <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>
   ...
于 2013-04-02T13:07:13.100 回答