【问题标题】:JAXB - Marshalling and Unmarshalling a Java child objectJAXB - 编组和解组 Java 子对象
【发布时间】:2015-08-25 23:19:46
【问题描述】:

我在一些 Web 服务对象上使用 JAXB,然后将这些对象编组为 XML,以便将它们发送到 UI。我的问题是我的父 Java 对象(提供者)包含子子对象(服务)。两个不同的提供者可以共享同一个服务。在 Java 中,这是一个 Service 对象,由两个 Provider 对象引用,但在 XML 中,它被翻译成这样的:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Body>
    <dlwmin:getProviders2Response xmlns:dlwmin="http://..." xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <provider xsi:type="provider">
        <name>First Provider</name>
        <providerId>1</providerId>
        <service>
          <id>1</id>
          <serviceName>Abc</serviceName>
        </service>
      </provider>
      <provider xsi:type="provider">
        <name>Second Provider</name>
        <providerId>2</providerId>
        <service>
          <id>1</id>
          <serviceName>Abc</serviceName>
        </service>
      </provider>
    </dlwmin:getProviders2Response>
  </soapenv:Body>
</soapenv:Envelope>

但我想要的是这样的:

  <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Body>
      <dlwmin:getProvidersResponse xmlns:dlwmin="http://..." xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <provider> 
          <name>First Provider</name>
          <providerId>1</providerId>
          <service>1</service>
        </provider>
        <provider> 
          <name>Second Provider</name>
          <providerId>2</providerId>
          <service>1</service>
        </provider>
        <service> 
          <id>1</id> 
          <serviceName>Abc<serviceName/>
        </service>
      </dlwmin:getProvidersResponse>
    </soapenv:Body>
  </soapenv:Envelope>

或许:

  <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Body>
      <dlwmin:getProvidersResponse xmlns:dlwmin="http://api.ws.hana.dhs.hawaii.gov/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <provider name="First Provider" providerId="1" service="1"/>
        <provider name="Second Provider" providerId="2" service="1"/>
        <service id="1" serviceName="Abc"/>
      </dlwmin:getProvidersResponse>
    </soapenv:Body>
  </soapenv:Envelope>

Service 元素直接来自 Provider 对象(注意:我不想使用具有服务列表和提供者列表的包装器对象)。

这可能使用 JAXB 注释或其他方式吗?当我在 UI 端收到 XML 时,如何将其解组为具有服务的提供者列表,而不创建应该是同一个 Java 对象的服务的副本?提前致谢。

【问题讨论】:

  • JAXB 只是将 XML 映射(绑定)到 java 类。如果 XML 不同,并且您有一个匹配的 Schema,那么您将获得匹配的 Java 类。所以,是的,如果您可以控制 XML / Schema / WSDL,您可以让它看起来完全符合想要的方式。

标签: java xml web-services jaxb marshalling


【解决方案1】:

你需要@XmlIdRef,这里是一个例子

JAXB and Shared References: @XmlID and @XmlIDREF

还有@XmlSeeAlso

XmlIDREF is not working 或者 JAXB and Inheritance

【讨论】:

  • 谢谢,但我已经试过了。这样做的问题是它需要一个包装对象(在示例中,这将是 Company 类)。这对我不起作用,因为我必须将提供程序和服务分成两个单独的列表,我不想这样做
猜你喜欢
  • 2016-01-26
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多