spring下的webservice之xfire

xfire的下載站點。下載了xfire,結合本機上的spring配置文件,做如下配置:

在spring的配置文件applicationContext-webservice.xml中增加如下配置:
<!-- xfire webservice -->
<!--   xfire默認配置文件,存在jar包中 -->
<import resource="classpath:org/codehaus/xfire/spring/xfire.xml"/>

<bean id="baseWebService" class="org.codehaus.xfire.spring.remoting.XFireExporter" lazy-init="false"
    abstract="true">
   <property name="serviceFactory" ref="xfire.serviceFactory"/>
   <property name="xfire" ref="xfire"/>
</bean>

<!-- webService的接口類 -->
<bean name="IUserManager" parent="baseWebService">
   <property name="serviceBean" ref="xfireUserService"/>
   <property name="serviceClass" value="com.sillycat.core.webservice.IUserManager"/>
</bean>

<!-- webService的包裝實現類 -->
<bean name="xfireUserService" class="com.sillycat.core.webservice.impl.XfireUserService" />

在WebRoot/WEB-INF/web.xml中增加如下配置:
<!-- xfire webservice -->
<servlet>
        <servlet-name>XFireServlet</servlet-name>
        <servlet-class>org.codehaus.xfire.spring.XFireSpringServlet</servlet-class>
</servlet>
              
<servlet-mapping>
        <servlet-name>XFireServlet</servlet-name>
        <url-pattern>/services/*</url-pattern>
</servlet-mapping>

接口和以前的axis的接口一致,嘿嘿。我這次配置的還是axis和xfire可以混用的,不過一般項目中怎麼可能兩個混用呢。只是學習的時候用用吧。
IUserManager.java :

package com.sillycat.core.webservice;

import java.util.List;

import com.sillycat.core.webservice.model.IUser;

public interface IUserManager {

public List<IUser> getAllUser();

public IUser getUser(Integer id);

public void saveUser(IUser user);

public void removeUser(Integer id);
}

XfireUserService實現類,XfireUserService.java:

package com.sillycat.core.webservice.impl;

import java.util.List;

import com.sillycat.core.model.User;
import com.sillycat.core.service.UserManager;
import com.sillycat.core.webservice.IUserManager;
import com.sillycat.core.webservice.model.IUser;
import com.sillycat.core.webservice.transformer.UserTransformer;

public class XfireUserService implements IUserManager {

private UserManager userManager;

public List<IUser> getAllUser() {
   return userManager.getAllUser();
}

public IUser getUser(Integer id) {
   User u = userManager.getUser(id);
   IUser i = UserTransformer.transformUser2IUser(u);
   return i;
}

public void removeUser(Integer id) {
   userManager.removeUser(id);
}

public void saveUser(IUser user) {
   //TODO
}

public void setUserManager(UserManager userManager) {
   this.userManager = userManager;
}

}

這樣server端就配置好了。如果訪問這個地址能訪問到WSDL文件,就成功了:
http://www.sillycat.com/easyLife/services/IUserManager?wsdl
http://www.sillycat.com/easyLife 是地址
services/IUserManager?wsdl            是提供出來的接口名字

客戶端調用用myeclipse可以生成,用springside上提供的client的方式用也可以,不過都覺得不爽。稍微修改了一下,參考axis的客戶端調用
首先寫了一個調用的工具類XFireClientFactory.java,把calvin的類改了改,繼承自FactoryBean接口:

package com.sillycat.plugin.webservice.xfire;

import java.net.MalformedURLException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.codehaus.xfire.annotations.AnnotationServiceFactory;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.util.Assert;

/**
* XFire Client 工廠�?. <p/>
* <p>
* 封裝了XFire有點奇�?�的根據Web服務接口類和Service URL 生成客戶端Proxy類的代碼. 同時使用泛型,減少了返回時的強制類型轉�?.
* </p>
*
* @author calvin
*/
@SuppressWarnings("unchecked")
public class XFireClientFactory implements FactoryBean {
private static XFireProxyFactory serviceFactory = new XFireProxyFactory();

private static final Log log = LogFactory.getLog(XFireClientFactory.class);

private String serviceURL;

private String serviceClassName;

private XFireClientFactory() {
}

public Object getObject() throws Exception {
   String url = this.getServiceURL();
   Class sClass = null;
   try {
    sClass = Class.forName(this.getServiceClassName());
   } catch (ClassNotFoundException e) {
    log.error(e.getMessage(), e);
    return null;
   }
   Assert.notNull(url);
   Assert.notNull(sClass);
   Service serviceModel = new ObjectServiceFactory().create(sClass);
   try {
    return serviceFactory.create(serviceModel, url);
   } catch (MalformedURLException e) {
    log.error(e.getMessage(), e);
    return null;
   }
}

public Class getObjectType() {
   Class sClass = null;
   try {
    sClass = Class.forName(this.getServiceClassName());
   } catch (ClassNotFoundException e) {
    log.error(e.getMessage(), e);
    return null;
   }
   return sClass;
}

public boolean isSingleton() {
   return true;
}

/**
* 獲得POJO形式的Web服務的客戶端Proxy�?.
*
* @param serviceURL
*            Web ServiceURL
* @param serviceClass
*            Web Service接口�?
* @return 類型爲Web Service接口的客戶端Proxy�?
*/
public static <T> T getClient(String serviceURL, Class<T> serviceClass) {
   Assert.notNull(serviceURL);
   Assert.notNull(serviceClass);
   Service serviceModel = new ObjectServiceFactory().create(serviceClass);
   try {
    return (T) serviceFactory.create(serviceModel, serviceURL);
   } catch (MalformedURLException e) {
    log.error(e.getMessage(), e);
    return null;
   }
}

/**
* 獲得JSR181形式定義的Web服務的客戶端Proxy�?. 注意和普通的生成客戶端方法不�?,�?要多�?個implClass參數.
*
* @param serviceURL
*            Web ServiceURL.
* @param serviceClass
*            Web Service接口�?.
* @param implClass
*            Web Service街口的服務端實現�?.
* @return 類型爲Web Service接口的客戶端Proxy�?.
*/
public static <T> T getJSR181Client(String serviceURL,
    Class<T> serviceClass, Class implClass) {
   Assert.notNull(serviceURL);
   Assert.notNull(serviceClass);
   Service serviceModel = new AnnotationServiceFactory().create(implClass);
   try {
    return (T) serviceFactory.create(serviceModel, serviceURL);
   } catch (MalformedURLException e) {
    log.error(e.getMessage(), e);
    return null;
   }
}

public String getServiceURL() {
   return serviceURL;
}

public void setServiceURL(String serviceURL) {
   this.serviceURL = serviceURL;
}

public String getServiceClassName() {
   return serviceClassName;
}

public void setServiceClassName(String serviceClassName) {
   this.serviceClassName = serviceClassName;
}

}

上面這個客戶端調用接口類,其實一般都是不變了。每次新增一個調用就新增一個spring的配置就可以了,還是在
applicationContext-webservice.xml這個配置裏面增加如下幾行:
<bean name="userManagerXfire"
    class="com.sillycat.plugin.webservice.xfire.XFireClientFactory">
   <property name="serviceURL" value="http://www.sillycat.com/easyLife/services/IUserManager"/>
   <property name="serviceClassName" value="com.sillycat.core.webservice.IUserManager"/>
</bean>

serviceURL是提供webservice的地址
serviceClassName是webservice這個類的接口。呵呵。這種方法調用默認要把接口類打包到調用webservice那邊去哈。
接口發佈給別人不算泄密吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章