天天看點

WebService基本程式設計—xfire

最近研究了一下WebService的用法,使用的是xfire+tomcat以及xfire+Weblogic9.2.借助于工具MyEclipse建立一個WebService是非常容易的事情,可以通過MyEclipse的File ——》New ——》Web Service Project的步驟建立一個WebService工程,如果使用Xfire的話,注意選擇xfire。這樣隻是建立了一個WebService工程,要想生成一個服務端的架構可以通過File——》New——》Other——》Web Services ——》Web Servie,在New Web Service頁面上選擇已經建立好的Web Service Project.在Strategy選項選擇Create Web Service from java class ,并勾選上Create new java bean,完成後在名為I**(**為你的WebService名稱)中定義WebService接口,在**Impl檔案中實作你的WebService邏輯。然後使用tomcat釋出就可以了。

在使用Weblogic作為伺服器釋出的時候,和上面步驟一樣,隻是進行釋出的時候配置一下Weblogic就行。在這個過程中可能遇到以下問題:

一,在myeclipse啟動不起來Weblogic,解決:進入Weblogic目錄,手動啟動就行。

二,weblogic啟動可能報錯:

<BEA-160197>

<Unable to load descriptor C:\bea\user_projects\domains\base_domain\.\autodeploy\demo/WEB-INF/web.xml of module webProject. The error is weblogic.descriptor.DescriptorException: Unmarshaller failed

at weblogic.descriptor.internal.MarshallerFactory$1.createDescriptor

Caused by: com.bea.xml.XmlException: failed to load java type corresponding to [email protected]://java.sun.com/xml/ns/javaee

at com.bea.staxb.runtime.internal.UnmarshalResult.getPojoBindingType

解決方法:

我把原來的:

<web-app version="2.5"

xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

換成:

<web-app xmlns:j2ee="http://java.sun.com/xml/ns/j2ee">即可。原來是weblogic92不支援用eclipse自動生成2.5版本的web.xml。

再說說用戶端程式設計,用戶端也可以通過myeclipse自動生成,隻要指定wsdl檔案或者服務端的wsdl的URL。不但可以傳遞簡單類型,也可以傳遞複雜類型。以下是用戶端調用的代碼示例:

public static void main(String[] args) {

MyWebServiceClient client = new MyWebServiceClient();

//create a default service endpoint

MyWebServicePortType service = client.getMyWebServiceHttpPort();

//TODO: Add custom client code here

//

//service.yourServiceOperationHere();

//調用operaiton方法

int re = service.operaiton(1900, 66, "*");

System.out.println("計算結果為:"+re);

//調用modified(User U)方法

ArrayOfUser a = new ArrayOfUser();

User u = new User();

//注意通過JAXB傳遞字元串型,因為綁定了JAXB,命名空間http://service.web一定要寫對

JAXBElement<String> name = new JAXBElement<String>(new QName(

"http://service.web", "name"), String.class, "Mr.li");

u.setName(name);

u.setNumber(007);

//無法修改服務端設定的name和number

service.modified(u);

List<User> l = new ArrayList<User>();

a.user = l;

a.user.add(u);

//調用addUser(List<User> l)方法

ArrayOfUser li = (ArrayOfUser)service.addUser(a);

for(int i = 0; i <li.user.size();i++)

{

System.out.println(li.user.get(i).getName().getValue());

System.out.println(li.user.get(i).getNumber());

}

System.out.println("test client completed");

System.exit(0);

}

這樣就完成了Webservice的建立和調用過程。

PS:WebService以我目前的了解好像不能處理傳出參數,也就是我傳入一個參數USer u,在服務端改變了User U的值(比如是名字和編号),用戶端調用後,不能獲得服務端修改的值。也就是服務端對用戶端的響應内容都是通過傳回值來的。如果哪位有不同見解,可以聯系我,我們一起探讨。

繼續閱讀