2013-06-01 85 views
0

我試圖創建動態WS客戶端和我有一些問題用的ComplexType參數WS操作。這裏是例子:WS動態客戶端和複雜類型參數

的WebService:

@WebMethod 
public int testPerson(Person a) { 
    return a.getAge(); 
} 



class Person { 
    private int age; 

    public Person() { 
    } 

    public Person(int i) { 
     this.age = i; 
    }; 

    public int getAge() { 
     return age; 
    } 

    public void setAge(int age) { 
     this.age = age; 
    } 
} 

這裏是我如何調用WS:

Client c = JaxWsDynamicClientFactory.newInstance().createClient("wsdlPath"); 
c.invoke("testPerson",...); 

好吧,我的問題是,我應該通過什麼參數來調用此WebService(如我說客戶端必須是動態的,所以我不能將類Person導入客戶端)?是否有可能我只傳遞基本類型的結構(在這種情況下,一個元素結構與年齡參數)?謝謝你的任何建議。

回答

1

您不能使用JaxWsDynamicClientFactory,如果你不打算爲它提供複雜類型

而且,你在技術上沒有導入Person型到客戶端。你真正需要做的是類型知道和使用反射在運行時生成的類的實例。

你在這裏所用的createClient版本是隻對接受簡單類型的web服務運營良好。爲了能夠複雜類型傳遞給動態web服務客戶端,

  1. JaxWsDynamicClientFactory需求來動態地用下面的生成所必需的支持類:

    ClassLoader loader = this.getClass().getClassLoader(); 
    JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); 
    Client client = dcf.createClient("wsdlPath", classLoader); 
    

    此創建Client對象,也是必要的POJO。

  2. 然後你就可以與調用服務:

    //Dynamically load an instance of the Person class. You're not importing and you can simply configure the class name as an application property 
    Object person = Thread.currentThread().getContextClassLoader().loadClass("foo.bar.Person").newInstance(); 
    Method theMethod = person.getClass().getMethod("setAge", Integer.class); 
    theMethod.invoke(person, 55); //set a property 
    
    client.invoke("testPerson", person); //invoke the operation. 
    

除非上述方法,唯一的另一種方法是構建SOAP有效載荷使用Dispatch API手動。這是一個艱苦的方法(確保它是你想要的)。

最終,這兩種方法都需要您預先知道在webservice調用期間您將要處理的類型

+0

謝謝。只是爲了擴大你的問題與同樣的問題別人:我已經使用BeanUtils的lib中添加參數爲對象,所以你不需要調用setter方法 – graczun

+0

如何是上面的代碼中動態的,當你硬編碼「foo.bar.Person」? – Stackee007

+0

@ Stackee007 - 這是動態的,因爲我們沒有硬編碼WSDL存​​根(或端點地址),也沒有實際的類類型,即我們沒有做這樣的:'人的人=新的Person()'。一個基本的字符串參數可以很容易地與來自屬性文件 – kolossus