我有一个 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>
当我通过wsimport
工具运行 WSDL 时,我得到了一个生成的类,该类将以下xs:any
字段映射为对象列表:
public static class MethodXMLResult {
@XmlMixed
@XmlAnyElement(lax = true)
protected List<Object> content;
}
使用生成的代码调用服务时,我在content
列表中(准确地说是com.sun.org.apache.xerces.internal.dom.ElementNSImpl
)中获得了org.w3c.dom.Node
实例,我需要自己解析这些实例。但是,我为实际返回的对象提供了一个单独的外部架构文档 - 我正在尝试以某种方式将其提供给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
从外部架构生成类。甚至可能吗?任何帮助将不胜感激。
我看到您在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>
可以将外部 JAXB 绑定文件添加到 wsimport 中,但可以使用 -b 参数。
我认为您可以通过以下方式调整 xs:any:
跳过舍玛:
<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();
和:
与 processContent=lax 表示任何 XML 元素都可以 放置在此处,但如果它们的元素名称与 架构,它们必须是有效的。XJC实际上完全像 processContent='strict',因为严格绑定允许未知 元素。
您可以在此链接中阅读更多信息。
可能有助于此答案完成您的JAX-WS/JAXB自定义文件。