【问题标题】:Add default namespace to an element within soap body将默认命名空间添加到肥皂体内的元素
【发布时间】: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(以便我看到 &lt;B xmlns="bNamespace"&gt;)?

【问题讨论】:

  • 在这里查看我的答案: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 - 我不确定你能做到,无论如何都不容易。这两个文档在它们的命名空间限定上是等价的。他们真的需要使用仅默认命名空间的方法吗?

标签: soap xsd jaxb wsdl jax-ws


【解决方案1】:

我通过将 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>
   ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 2019-10-01
    • 2011-07-18
    • 1970-01-01
    • 2011-03-20
    • 2019-11-17
    相关资源
    最近更新 更多