摆脱由ant调用的wsimport生成的类中的JAXBElement

时间:2010-02-01 14:03:41

标签: java web-services ant jaxb wsimport

我有以下问题: 我正在使用wsimport ant任务来创建一个webservice客户端(对于salesforce.com)。 一切正常,但生成的类都使用这个奇怪的JAXBElement类用于所有bean属性。

例如:

public void setLastName(JAXBElement<String> value) {
    this.lastName = ((JAXBElement<String> ) value);
}

public JAXBElement<String> getCountry() {
    return country;
}

我希望有一些简单的方法,比如setLastName(String newLastName),而不是将所有类包装在JAXBElement中。 这就是我调用wsimport任务的方式。

<wsimport debug="false" verbose="false" keep="${keep}" 
   extension="${extension}" destdir="${tmp.metro}" 
   wsdl="${licensing.wsdl}" 
   sourcedestdir="${licensingws.generated.src}"

   >

   <binding dir="${basedir}/etc" includes="${client.binding}"   
     />
    <arg value="-B-XautoNameResolution" />

  </wsimport>

任务以这种方式定义:

    

有人知道我要设置什么,以便wsimport以我想要的方式生成类吗? 非常感谢提前!!!

4 个答案:

答案 0 :(得分:27)

在生成的bean中使用JAXBElement包装器的原因可能是,WSDL声明该字段既可选又可以为nillable。要区分“not present”和“present,but null”,不能直接使用String类型,因为两种情况下的String都是null。

如果您不需要区分这两种情况,可以configure the code generator使用String类型。我不是100%确定如何使用ant任务执行此操作,但您可能会在ant任务文档中找到相关信息。

答案 1 :(得分:4)

您必须customize the binding

答案 2 :(得分:1)

我遇到过类似的问题。

我使用了下面的绑定XML而天花板wsimport:引用了这个link

绑定文件

<jaxb:bindings version="2.1" 
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
   <jaxb:globalBindings generateElementProperty="false"/> 
</jaxb:bindings>

示例wsimport命令:

wsimport -keep  <WSDL_location>  -b employerServiceWSD
L_binding.xjb

注意: employerServiceWSDL_binding.xjb包含上述绑定xml条目。

希望它也适用于其他人。

答案 3 :(得分:0)

解决方案是使用“绑定”文件,并为每种数据类型添加转换器。下面是我的示例,您可以根据WSDL修改javaType。此外,教程还介绍了如何正确地从wsdl-> java POJO传递方法。

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
               jaxb:version="1.0"
               xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc">
    <jaxb:globalBindings generateElementProperty="false">
    <jaxb:serializable uid="1"/>
    <jaxb:javaType name="java.util.Calendar" xmlType="xs:dateTime"
        parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime"
        printMethod="javax.xml.bind.DatatypeConverter.printDateTime"/> 
    <jaxb:javaType name="java.util.Calendar" xmlType="xs:date"
                parseMethod="javax.xml.bind.DatatypeConverter.parseDate" 
                printMethod="javax.xml.bind.DatatypeConverter.printDate" />
    <jaxb:javaType name="java.util.Calendar" xmlType="xs:time"
                parseMethod="javax.xml.bind.DatatypeConverter.parseTime" 
                printMethod="javax.xml.bind.DatatypeConverter.printTime" />
 </jaxb:globalBindings>
</jaxb:bindings>