jaxb - WSDL2Java:缺少复杂元素类型生成 java.lang.Object 参数类型
问题描述
我正在尝试导入此 WSDL:https ://gateway.monster.com:8443/bgwBroker
其中,它包括这个 XSD: http: //schemas.monster.com/current/xsd/Query.xsd,其中包含这个片段:
<xsd:element name="Query">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Target" type="xsd:string"/>
<xsd:element name="SubTarget" type="xsd:string" minOccurs="0"/>
<xsd:element name="ResumeRestriction" minOccurs="0"/>
<xsd:element name="ReturnRestriction" minOccurs="0" maxOccurs="unbounded">
...
</xsd:element>
<xsd:element name="SelectBy" minOccurs="0" maxOccurs="unbounded">
...
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
...
<xsd:element name="ResumeRestriction">
...
</xsd:element>
如您所见,复杂类型ResumeRestriction
及其字段定义在底部,但在 Query 内部被引用。这里缺少一个参考。ReturnRestriction
并SelectBy
内联定义并正确生成。
使用 WSDL2Java,这会生成以下带注释的类:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"target",
"subTarget",
"resumeRestriction",
"returnRestriction",
"selectBy"
})
@XmlRootElement(name = "Query")
public class Query {
@XmlElement(name = "Target", required = true)
protected String target;
@XmlElement(name = "SubTarget")
protected String subTarget;
@XmlElement(name = "ResumeRestriction")
protected Object resumeRestriction;
...
public void setResumeRestriction(Object value) {
this.resumeRestriction = value;
}
}
制作resumeRestriction
类型Object
而不是正确的类型。
如果有生成的版本ResumeRestriction
就好了。他们只是没有被捆绑在一起:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"storeRenderedTextResume",
"doNotRenderSid",
"activeOnBoard"
})
@XmlRootElement(name = "ResumeRestriction")
public class ResumeRestriction {
...
}
如果我现在使用 Spring Web 服务创建一个请求,我将无法使用ResumeRestriction
该类,我需要在我的请求中设置一个特定的标志。
ObjectFactory objectFactory = new ObjectFactory();
Query query = objectFactory.createQuery();
query.setTarget("JobSeekers");
ResumeRestriction resumeRestriction = objectFactory.createResumeRestriction();
resumeRestriction.setStoreRenderedTextResume(true);
query.setResumeRestriction(resumeRestriction);
getWebServiceTemplate().marshalSendAndReceive("https://gateway.monster.com:8443/bgwBroker", query);
这将引发以下错误:
[com.sun.istack.SAXException2: Instance of "com.monster.schemas.monster.ResumeRestriction" is substituting "java.lang.Object", but "com.monster.schemas.monster.ResumeRestriction" is bound to an anonymous type.]
我怎么解决这个问题?
我显然无法更改 WSDL 或 XSD,因为我将它们远程拉入。这是他们方面的错误吗?如果是,我可以解决它吗?
解决方案
您可以在 JAXB 绑定文件中指定类引用:
<jxb:bindings
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
version="2.1"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
jxb:extensionBindingPrefixes="xjc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemalocation="http://java.sun.com/xml/ns/jaxb
http://java.sun.com/xml/ns/jaxb"
>
<jxb:bindings >
<jxb:globalBindings typesafeEnumMaxMembers="3000"/>
</jxb:bindings>
<jxb:bindings schemaLocation="http://schemas.monster.com/current/xsd/Query.xsd">
<jxb:bindings node="//xs:element[@name='Query']//xs:element[@name='ResumeRestriction']">
<jxb:class ref="com.monster.schemas.monster.ResumeRestriction"/>
</jxb:bindings>
</jxb:bindings>
</jxb:bindings>
推荐阅读
- excel - 在编译以下代码时,我有一个错误对象变量或未设置块变量
- datagrip - 在结果集上编辑/删除数据时获取执行查询的日志
- arrays - 在特定列标准的范围内创建边框
- python-3.x - 首次安装 Apache Airflow 失败 - 缺少 Python.h
- swift - 如何从另一个类更新 UILabel 类
- python - 一种热编码 Python 不同类别
- flutter - 如何将 TextStyle 和 textTheme 应用到 Flutter 中的 Text 小部件?
- python - 如何在 python 中从 pandas 数据框加载 Weka 数据集
- azure - 为已经可用的 REST API 创建一个交互点
- android - 使用“EAN_13,EAN_8,UPC_A,UPC_E”android 扫描时面临问题