问题 :
使用 wsimport命令 或cxf的 wsdl2java命令 生成 的 webservice客户端代码中 , 有时会出现
JAXBElement 字段类型 ,此时不知道该怎么赋值了;
出现JAXBElement字段类型的原因:
因为服务器端的wsdl文件加了nillable="true"这个属性 所以生成的webservice客户端代码中的, String类型
就会变 成JAXBElement< String >类型
解决办法1 (推荐):
可以生成去除该字段类型的 客户端代码 ; 比如 JAXBElement 可以变成 String 类型
第一步 : 创建 xml文件 , 命名为 remove.xml
<jaxb:bindings version="2.0"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb">
<jaxb:bindings>
<jaxb:globalBindings generateElementProperty="false"/>
</jaxb:bindings>
</jaxb:bindings>
第二步 : 生成客户端代码
wsimport -encoding utf-8 -b remove.xml -Xnocompile http://xxxxxxxx?WSDL
-encoding utf-8 表示 编码
-Xnocompile 表示生成java代码, 不加的话, 将会 只生成class 文件
-b 表示绑定指定文件此时生成的客户端代码中 , 原先的JAXBElement 字段类型 , 就会变成 String 类型;
解决办法2:
继续使用 JAXBElement 字段类型 进行赋值
赋值方法1:
User user = new User();
JAXBElement<String> name = new JAXBElement<String>(new QName("http://xxxxxx", "username"), String.class, "字段值");
user.setUsername(name);
Qname中的第一个参数的地址 , 去ObjectFactory.java文件中可以找到 ;
赋值方法2 ( 简单 ) :
User user = new User();
ObjectFactory objFac=new ObjectFactory();
JAXBElement<String> name = objFac.createUserUsername("字段值");
user.setUsername(name);
此种方法, 跟赋值方法1效果是一样的, 就是不用我们自己去ObjectFactory中找 QName中的值了 ,
而是直接通过ObjectFactory来创建;