【问题标题】:WSDL2Java: missing complex element type generates java.lang.Object argument typesWSDL2Java:缺少复杂元素类型生成 java.lang.Object 参数类型
【发布时间】:2020-02-19 17:38:36
【问题描述】:

我正在尝试导入此 WSDL:https://gateway.monster.com:8443/bgwBroker

其中包括此 XSD:http://schemas.monster.com/current/xsd/Query.xsd,其中包含此 sn-p:

<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 spring-ws wsdl2java wsimport


    【解决方案1】:

    您可以在 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-13
      • 2011-04-12
      • 1970-01-01
      • 2020-02-07
      • 2011-12-29
      • 2017-10-30
      • 2020-08-04
      相关资源
      最近更新 更多