最近研究了一下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的值(比如是名字和編号),用戶端調用後,不能獲得服務端修改的值。也就是服務端對用戶端的響應内容都是通過傳回值來的。如果哪位有不同見解,可以聯系我,我們一起探讨。