關於cxf生成客戶端代碼中的JAXBElement

一、使用自動生成的java文件中的 ObjectFactory構造入參html

關於cxf生成客戶端代碼中的JAXBElement<String>
    在使用cxf或者x-fire進行webservice開發時,從wsdl文件生成客戶端代碼時,若是有屬性的類型是String,可能會出現JAXBElement<String>類型。
    爲何webservice客戶端不直接使用String,而使用JAXBElement<String>類型,天然是有緣由的,是由於服務器端的wsdl文件有nillable="true"這個屬性。
   此時有兩種方法對這個JAXBElement<String>類型賦值。
   1.java

  1.  
    User user = new User();
  2.  
    JAXBElement<String> name = new JAXBElement<String>(new QName("http://memberService", "username"), String.class, "smallnest");
  3.  
    user.setUsername(name);


使用這種方法時,有不少人發現客戶端的數據確實存入了,但是到了服務器端,經過.getUsername().getValue()調用時,倒是null,緣由就是Qname值不對!注意,在生成的客戶端代碼裏有private static final QName SERVICE_NAME = new QName("xxx","xx");
並非這個QName,真正的Qname要去ObjectFactory.java文件去找。只要QName寫對,這種調用方法是能夠的。
   2.固然,還有一種更簡單的方法,直接使用ObjectFactory這個類來調用:web

  1.  
    User user = new User();
  2.  
    ObjectFactory objFac= new ObjectFactory();
  3.  
    JAXBElement<String> name = objFac.createUserUsername( "smallnest");
  4.  
    user.setUsername(name);


這樣就簡便多了apache

 

 

二、生成代碼時服務器

 

使用的wsdl2java是cxf中的工具,cxf能夠到apache下面下載frontend

wsdl2java用法: 工具

wsdl2java -p com -d srcl  aa.wsdl 測試

-p  指定其wsdl的命名空間,也就是要生成代碼的包名: spa

-d  指定要產生代碼所在目錄 .net

-client 生成客戶端測試web service的代碼 

-server 生成服務器啓動web  service的代碼 

-impl 生成web service的實現代碼 

-b  binding-file-name

 

若是直接使用wsdl2java.bat -client -d E:/tmp -frontend jaxws21 wsdl文件

生成的客戶端代碼中有JAXBElement<String>

 

使用wsdl2java.bat -b "1.txt" -client -d E:/tmp -frontend jaxws21 wsdl文件,就能夠生成正常的pojo類

 

1.txt的文件內容爲

 

[html]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到個人代碼片
  1. <jaxb:bindings version="2.1"   
  2. xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"   
  3. xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"   
  4. xmlns:xs="http://www.w3.org/2001/XMLSchema">   
  5.    <jaxb:globalBindings generateElementProperty="false"/>   
  6. </jaxb:bindings>   

 

打包爲jar

進入到tmp目錄中

jar -cvf ***.jar .

 

原文地址:https://blog.csdn.net/z69183787/article/details/53505941

相關文章
相關標籤/搜索