从ant调用的wsimport生成的类中删除JAXBElement

28
我有以下问题:我正在使用wsimport ant任务创建一个Web服务客户端(用于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 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个回答

31
使用JAXBElement包装类生成的bean的原因可能是,WSDL声明该字段既可选又可空。为了区分“不存在”和“存在但为空”,不能直接使用String类型,因为在两种情况下都会为null。
如果您不需要区分这两种情况,可以配置代码生成器以使用String类型,具体方法请参见配置文件生成器。我不确定如何在ant任务中完成这个操作,但您可能会在ant任务文档中找到相关信息。

7
谢谢,我使用这个绑定文件解决了问题:<jxb:bindings version="2.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="" rel = "nofollow noreferrer">http://www.w3.org/2001/XMLSchema"> </jxb:bindings>在build.xml中声明如下: <wsimport ... > <binding dir="." includes="simple-binding.xjb" /> </wsimport> - MisterY
1
要配置jaxws绑定文件,请参见此链接:http://metro.1045641.n5.nabble.com/Generated-Code-with-minOccurs-0-and-nillable-true-contains-JAXBElement-tp1063625p1063626.html - GWTNewbie

4

我遇到了类似的问题。

在使用wsimport时,我使用了以下绑定XML,并参考了此链接

绑定文件

<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条目。

希望这对其他人也有效。


4

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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接