1. 程式人生 > >XFire調用CXF參數為Null的問題

XFire調用CXF參數為Null的問題

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(List
<User> userList); }
View Code

實現類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")
public 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; } }
View Code

服務啟動類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的問題