WebService的原始API直接书写在代码中有诸多不便,如果我们把其调用过程归纳成一个类,再用Spring把URI和方法名注入到实例中去,这样就好些了。
归纳出来的WebService调用类:
package com.heyang;
import java.net.MalformedURLException;
import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
/**
* WebService统一调用类
* @author: 何杨(heyang78@gmail.com)
* @date: 2009-10-10-下午11:47:56
*/
public class WebService{
private String endpoint;
private String operationName;
/**
* 取得WebService调用的结果
* @param args
* @return
* @throws ServiceException
* @throws MalformedURLException
* @throws RemoteException
*/
public Object getCallResult(Object[] args)throws ServiceException, MalformedURLException, RemoteException{
// 创建 Service实例
Service service = new Service();
// 通过Service实例创建Call的实例
Call call = (Call) service.createCall();
// 将Web Service的服务路径加入到call实例之中.
call.setTargetEndpointAddress(new java.net.URL(endpoint));// 为Call设置服务的位置
// 调用Web Service的方法
call.setOperationName(operationName);
// 调用Web Service,传入参数
return call.invoke(args);
}
public String getEndpoint() {
return endpoint;
}
public void setEndpoint(String endpoint) {
this.endpoint = endpoint;
}
public String getOperationName() {
return operationName;
}
public void setOperationName(String operationName) {
this.operationName = operationName;
}
}
再在上下文中配置三个bean,这样WebService的相关信息就变成可配置方式了:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="method_isExist" class="com.heyang.WebService" >
<property name="endpoint">
<value>http://localhost:8080/UserLoginService/services/login</value>
</property>
<property name="operationName">
<value>isExist</value>
</property>
</bean>
<bean id="method_getUserRole" class="com.heyang.WebService" >
<property name="endpoint">
<value>http://localhost:8080/UserLoginService/services/login</value>
</property>
<property name="operationName">
<value>getUserRole</value>
</property>
</bean>
<bean id="method_getUserTrade" class="com.heyang.WebService" >
<property name="endpoint">
<value>http://localhost:8080/UserLoginService/services/login</value>
</property>
<property name="operationName">
<value>getUserTrade</value>
</property>
</bean>
</beans>
调用因此也变得相对简单:
package com.heyang;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 使用Spring的简约式调用WebService
* @author: 何杨(heyang78@gmail.com)
* @date: 2009-10-10-下午11:40:49
*/
public class SpringTest{
public static void main(String[] args){
try{
ApplicationContext appContext = new ClassPathXmlApplicationContext("bean.xml");
Object[] params=new Object[] { "MT001","123" };
WebService ws1=(WebService)appContext.getBean("method_isExist");
WebService ws2=(WebService)appContext.getBean("method_getUserRole");
WebService ws3=(WebService)appContext.getBean("method_getUserTrade");
System.out.println(ws1.getCallResult(params));
System.out.println(ws2.getCallResult(params));
System.out.println(ws3.getCallResult(params));
}
catch(Exception ex){
ex.printStackTrace();
}
}
}
代码下载(jar请从前面的程序里找,WebService即用上一篇文章中的UserLoginService):
http://www.blogjava.net/Files/heyang/UserLoginServiceTest20091011082831.rar