我有一个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;
}
当使用生成的代码调用服务时,我在内容列表中获取了org.w3c.dom.Node的实例(准确地说是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从外部模式生成类的元素.它甚至可能吗?任何帮助将非常感激.
解决方法:
我看到你在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 whith -b parameter.
我认为您可以通过以下方式调整xs:any:
Skip 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();
和:
with processContents=lax means any XML elements can be
placed here, but if their element names match those defined in the
schema, they have to be valid. XJC actually handles this exactly like
processContents=’strict’, since the strict binding allows unknown
elements anyway.
您可以阅读有关in this link.的更多信息
可能有助于这个答案来完成您的JAX-WS / JAXB自定义文件.