我有以下问题: 我正在使用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以我想要的方式生成类吗? 非常感谢提前!!!
答案 0 :(得分:27)
在生成的bean中使用JAXBElement包装器的原因可能是,WSDL声明该字段既可选又可以为nillable。要区分“not present”和“present,but null”,不能直接使用String类型,因为两种情况下的String都是null。
如果您不需要区分这两种情况,可以configure the code generator使用String类型。我不是100%确定如何使用ant任务执行此操作,但您可能会在ant任务文档中找到相关信息。
答案 1 :(得分:4)
答案 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>