27

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

例如:

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

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

我不想将所有类都包装在 JAXBElement 中,而是使用像 setLastName(String newLastName) 这样的简单方法。这就是我调用 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

4 回答 4

30

在生成的 bean 中使用 JAXBElement 包装器的原因可能是 WSDL 声明该字段是可选的和可空的。为了区分“不存在”和“存在,但为空”,不能直接使用字符串类型,因为这两种情况下的字符串都是空的。

如果不需要区分这两种情况,可以将代码生成器配置为使用 String 类型。我不是 100% 确定如何使用 ant 任务执行此操作,但您可能会在 ant 任务文档中找到相关信息。

于 2010-02-01T14:26:57.113 回答
4

您将不得不自定义绑定

于 2010-02-01T14:21:45.220 回答
3

我遇到过类似的问题。

我在天花板 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 条目。

希望它也适用于其他人。

于 2017-07-12T11:57:21.090 回答
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>
于 2020-04-11T11:13:52.123 回答