原文地址:https://blog.csdn.net/z69183787/article/details/53505941?utm_source=blogxgwz5
1、使用自動生成的java文件中的 ObjectFactory構造入參
關於cxf生成客戶端代碼中的JAXBElement<String>
在使用cxf或者x-fire進行webservice開發時,從wsdl文件生成客戶端代碼時,如果有屬性的類型是String,可能會出現JAXBElement<String>類型。
為什么webservice客戶端不直接使用String,而使用JAXBElement<String>類型,自然是有原因的,是因為服務器端的wsdl文件有nillable="true"這個屬性。
此時有兩種方法對這個JAXBElement<String>類型賦值。
1.
-
User user = new User();
-
JAXBElement<String> name = new JAXBElement<String>(new QName("http://memberService", "username"), String.class, "smallnest");
-
user.setUsername(name);
使用這種方法時,有很多人發現客戶端的數據確實存入了,可是到了服務器端,通過.getUsername().getValue()調用時,卻是null,原因就是Qname值不對!注意,在生成的客戶端代碼里有private static final QName SERVICE_NAME = new QName("xxx","xx");
並不是這個QName,真正的Qname要去ObjectFactory.java文件去找。只要QName寫對,這種調用方法是可以的。
2.當然,還有一種更簡單的方法,直接使用ObjectFactory這個類來調用:
-
User user = new User();
-
ObjectFactory objFac= new ObjectFactory();
-
JAXBElement<String> name = objFac.createUserUsername( "smallnest");
-
user.setUsername(name);
這樣就簡便多了