XFire調用CXF參數為Null的問題
阿新 • • 發佈:2017-06-26
details system .com 1.2 ive 默認 發現 sage method
最近,領導分配了一個任務,做接口聯調。情況是這樣,對方客戶升級了接口采用CXF,而我們還是用的XFire1.2.6,首先就遇到了這個問題:XFire調用CXF參數為Null的問題 。
在網上搜了一大堆資料:
http://blog.csdn.net/larry_lv/article/details/6721057
http://ks2144634.blog.163.com/blog/static/133585503201412855556210/
按照第一個始終還是沒能解決,後來找到第二個花了不少時間也還是未能解決。
最後通過仔細琢磨,在第二個中發現Xfire默認會給映射的參數名稱加上命名空間(接口所在包的逆向),嘗試將targetNamespace的值改為接口包的逆向終於調試成功。
一、CXF服務服務端代碼
接口類HelloWorld.java
package com.hsy.server; import java.util.List; import javax.jws.WebParam; import javax.jws.WebService; import com.hsy.pojo.User; @WebService public interface HelloWorld { String sayHi(@WebParam(name="name", targetNamespace= "http://server.hsy.com/") String name); String sayHiToUser(User user); String[] SayHiToUserList(ListView Code<User> userList); }
實現類HelloWorldImpl.java
package com.hsy.server; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import javax.jws.WebService; import com.hsy.pojo.User; @WebService(endpointInterface="com.hsy.server.HelloWorld", serviceName="HelloWorld")View Codepublic class HelloWorldImpl implements HelloWorld { Map<Integer, User> users = new LinkedHashMap<Integer,User>(); @Override public String sayHi(String name) { System.out.println(name); return "Hello,"+name; } @Override public String sayHiToUser(User user) { users.put(users.size()+1, user); return "Hello,"+user.getName()+","+user.getDescription(); } @Override public String[] SayHiToUserList(List<User> userList) { String[] result = new String[userList.size()]; int i = 0; for(User u:userList){ result[i] = "Hello " + u.getName(); i++; } return result; } }
服務啟動類WebServiceTest.java
package com.hsy.server; import javax.xml.ws.Endpoint; public class WebServiceTest { public static void main(String[] args) { HelloWorldImpl hw = new HelloWorldImpl(); String address = "http://localhost:8080/cxf_service"; Endpoint.publish(address, hw); System.out.println("WebService暴露成功。。。"); } }View Code
二、XFire客戶端測試代碼
Xfire測試類XfireClient.java
package com.xhw; import java.net.HttpURLConnection; import java.net.URL; import org.codehaus.xfire.client.Client; import org.codehaus.xfire.transport.http.CommonsHttpMessageSender; /** * @filename XfireClient.java * @author xiehongwei * @date 2017-6-21 下午4:09:47 */ public class XfireClient { int Timeout=300000;//單位是毫秒 public static void main(String[] args) throws Exception { XfireClient xc = new XfireClient(); String urlStr = "http://localhost:8080/cxf_service/webservice/helloWorld?wsdl"; String moniterMethod = "sayHi"; Client client = xc.loadClient(urlStr); String name = "xiehongwei"; Object[] objs = client.invoke(moniterMethod, new Object[] { name }); System.out.println("返回值為:"+objs[0]); } public Client loadClient(String urlStr) throws Exception{ URL _url = new URL(urlStr); HttpURLConnection httpConnection = (HttpURLConnection)_url.openConnection(); httpConnection.setReadTimeout(Timeout);//設置http連接的讀超時,單位是毫秒 httpConnection.connect(); Client _client = new Client(httpConnection.getInputStream(), null); _client.setProperty(CommonsHttpMessageSender.HTTP_TIMEOUT, String.valueOf( Timeout ));//設置發送的超時限制,單位是毫秒; _client.setProperty(CommonsHttpMessageSender.DISABLE_KEEP_ALIVE, "true"); _client.setProperty(CommonsHttpMessageSender.DISABLE_EXPECT_CONTINUE, "true"); return _client; } }View Code
XFire調用CXF參數為Null的問題