4

我有一个 WSDL,它使用xsd:any其中一种方法的返回类型中的元素,如下所示:

<xs:element name="Method_XMLResponse">
  <xs:complexType>
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="1" name="Method_XMLResult">
        <xs:complexType mixed="true">
          <xs:sequence>
            <xs:any/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

当我通过该工具运行 WSDL 时wsimport,我得到一个生成的类,该类将该xs:any字段映射为对象列表:

public static class MethodXMLResult {

    @XmlMixed
    @XmlAnyElement(lax = true)
    protected List<Object> content;

}

使用生成的代码调用服务时,我会org.w3c.dom.Nodecontent列表中获得com.sun.org.apache.xerces.internal.dom.ElementNSImpl需要自己解析的实例(准确地说)。然而,我为实际返回的对象提供了一个单独的外部模式文档——我试图以某种方式将它提供给它,wsimport以便它也为它们生成类。

我正在尝试通过这样的 JAX-WS / JAXB 自定义文件来实现这一点:

<jaxws:bindings xmlns:s="http://www.w3.org/2001/XMLSchema"
                xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
                xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
                xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" xmlns:a="http://www.w3.org/2001/XMLSchema"
                wsdlLocation="wsdlLocation.wsdl">

    <jaxws:bindings node="wsdl:definitions">
        <jaxws:bindings node="wsdl:types" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb">
            <jaxws:bindings node="//s:schema[@targetNamespace='wsNamespace']">
                <jaxb:bindings node="//s:element[@name='Method_XMLResponse']//s:any">
                  ...
                </jaxb:bindings>
            </jaxws:bindings>
        </jaxws:bindings>
    </jaxws:bindings>
</jaxws:bindings>

看起来wsimport选择了正确的位置进行自定义(给了我许多错误消息,并在 WSDL 中正确指定了行号),但我不知道如何填充<jaxb:bindings>元素以wsimport从外部模式生成类。甚至可能吗?任何帮助将非常感激。

4

1 回答 1

2

我看到您在 XSD 中使用了 xs:any 的混合类型。我认为它对 JAXB 调整后的混合类型的自定义很有用:

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings
 xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.0"
 xmlns:xjc= "http://java.sun.com/xml/ns/jaxb/xjc" jaxb:extensionBindingPrefixes="xjc">

  <jaxb:globalBindings generateMixedExtensions="true"/>

</jaxb:bindings> 

您可以使用-b 参数将外部 JAXB 绑定文件添加到 wsimport 。

我认为您可以通过以下方式调整 xs:any:

跳过shema:

<xs:any processContents="skip" maxOccurs="unbounded" minOccurs="0" />

跳过绑定:

@XmlAnyElement
  public List<Element> getAny();

严格模式:

<xs:any maxOccurs="unbounded" minOccurs="0" />

严格绑定:

@XmlAnyElement(lax=true)
  public List<Object> getAny();

和:

使用 processContents=lax 意味着任何 XML 元素都可以放在此处,但如果它们的元素名称与架构中定义的名称匹配,则它们必须是有效的。XJC 实际上与 processContents='strict' 完全一样处理这个问题,因为严格绑定无论如何都允许未知元素。

您可以在此链接中了解更多信息。

可能有助于此答案完成您的 JAX-WS / JAXB 自定义文件。

于 2013-12-10T10:22:04.620 回答