[英]WSDL2Java: missing complex element type generates java.lang.Object argument types
我正在嘗試導入此 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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.