AXIS兑现WebService
AXIS实现WebService
结合SPRING + axis配置和使用起来都比较简单。
首先是下载axis过来咯。是apache的。
然后需要修改web.xml文件,配置axis的servlet:
增加了一个wsdd文件server-config.wsdd在WebRoot/WEB-INF下面:
其中的有些地方需要修改:
要改成自己的类名和包名
webservice设置一个自己的spring配置文件,配置服务端和客户端,applicationContext-webservice.xml:
配置就到这里结束了。另外说说类的结构
webservice下面分别有三块
webservice/impl/
JaxRpcUserService.java 核心实现类
webservice/model
IUser.java 和外部接口决定的接口类,不能直接用自己的User对象抛给别人,都要定义接口
webservice/transformer
UserTransformer.java 接口类和内部类的转换工具
webservice
IUserManager.java 抛给别人的接口,不能直接把内部的spring bean给别人使用,接口上专门包装一
个bean
webservice/axis 客户端调用的时候使用的plugin类,放置在plugin下面吧。在接口上要注册了
IUser类
才能相互传递
AxisPortProxyFactoryBean.java
IUserManager.java类,提供给外部的接口:
JaxRpcUserService.java接口实现类,调用内部的manager完成业务逻辑:
IUser.java定义的接口,相互传递参数:
UserTransformer.java转换类,接口和内部类的转换:
AxisPortProxyFactoryBean.java客户端调用时的基类:
最后单元测试一下就行了,UserManagerRemoteTest.java:
结合SPRING + axis配置和使用起来都比较简单。
首先是下载axis过来咯。是apache的。
然后需要修改web.xml文件,配置axis的servlet:
<!-- axis webservice --> <servlet> <servlet-name>axis</servlet-name> <servlet-class> org.apache.axis.transport.http.AxisServlet </servlet-class> <load-on-startup>4</load-on-startup> </servlet> <!-- axis webservice filter --> <servlet-mapping> <servlet-name>axis</servlet-name> <url-pattern>/axis/*</url-pattern> </servlet-mapping>
增加了一个wsdd文件server-config.wsdd在WebRoot/WEB-INF下面:
<?xml version="1.0" encoding="UTF-8"?> <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <globalConfiguration> <parameter name="adminPassword" value="admin"/> <parameter name="sendXsiTypes" value="true"/> <parameter name="sendMultiRefs" value="true"/> <parameter name="sendXMLDeclaration" value="true"/> <parameter name="axis.sendMinimizedElements" value="true"/> <requestFlow> <handler type="java:org.apache.axis.handlers.JWSHandler"> <parameter name="scope" value="session"/> </handler> <handler type="java:org.apache.axis.handlers.JWSHandler"> <parameter name="scope" value="request"/> <parameter name="extension" value=".jwr"/> </handler> </requestFlow> </globalConfiguration> <handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/> <handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/> <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/> <service name="User" provider="java:RPC"> <parameter name="allowedMethods" value="*"/> <parameter name="className" value="com.sillycat.core.webservice.impl.JaxRpcUserService"/> <beanMapping languageSpecificType="java:com.sillycat.core.webservice.model.IUser" qname="ns:IUser" xmlns:ns="urn:BeanService"/> </service> <transport name="http"> <requestFlow> <handler type="URLMapper"/> <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/> </requestFlow> </transport> <transport name="local"> <responseFlow> <handler type="LocalResponder"/> </responseFlow> </transport> </deployment>
其中的有些地方需要修改:
<service name="User" provider="java:RPC"> <parameter name="allowedMethods" value="*"/> <parameter name="className" value="com.sillycat.core.webservice.impl.JaxRpcUserService"/> <beanMapping languageSpecificType="java:com.sillycat.core.webservice.model.IUser" qname="ns:IUser" xmlns:ns="urn:BeanService"/> </service>
要改成自己的类名和包名
webservice设置一个自己的spring配置文件,配置服务端和客户端,applicationContext-webservice.xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- webservice axis server --> <bean name="/user" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter"> <property name="service"> <ref bean="jaxRpcUserService" /> </property> <property name="serviceInterface"> <value>com.sillycat.core.webservice.IUserManager</value> </property> </bean> <bean name="jaxRpcUserService" class="com.sillycat.core.webservice.impl.JaxRpcUserService"/> <!-- webservice axis client --> <bean id="userManagerRemote" class="com.sillycat.plugin.webservice.axis.AxisPortProxyFactoryBean" lazy-init="true"> <property name="serviceFactoryClass"> <value>org.apache.axis.client.ServiceFactory</value> </property> <property name="wsdlDocumentUrl"> <value>http://localhost/easyLife/axis/User?wsdl</value> </property> <property name="namespaceUri"> <value>http://localhost/easyLife/axis/User</value> </property> <property name="serviceName"> <value>JaxRpcUserServiceService</value> </property> <property name="portName"> <value>User</value> </property> <property name="serviceInterface"> <value>com.sillycat.core.webservice.IUserManager</value> </property> </bean> </beans>
配置就到这里结束了。另外说说类的结构
webservice下面分别有三块
webservice/impl/
JaxRpcUserService.java 核心实现类
webservice/model
IUser.java 和外部接口决定的接口类,不能直接用自己的User对象抛给别人,都要定义接口
webservice/transformer
UserTransformer.java 接口类和内部类的转换工具
webservice
IUserManager.java 抛给别人的接口,不能直接把内部的spring bean给别人使用,接口上专门包装一
个bean
webservice/axis 客户端调用的时候使用的plugin类,放置在plugin下面吧。在接口上要注册了
IUser类
才能相互传递
AxisPortProxyFactoryBean.java
IUserManager.java类,提供给外部的接口:
package com.sillycat.core.webservice; import java.util.List; import com.sillycat.core.webservice.model.IUser; public interface IUserManager { public List getAllUser(); public IUser getUser(Integer id); public void saveUser(IUser user); public void removeUser(Integer id); }
JaxRpcUserService.java接口实现类,调用内部的manager完成业务逻辑:
package com.sillycat.core.webservice.impl; import java.util.List; import org.springframework.remoting.jaxrpc.ServletEndpointSupport; 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 JaxRpcUserService extends ServletEndpointSupport implements IUserManager { private UserManager userManager; protected void onInit() { userManager = (UserManager) getWebApplicationContext().getBean( "userManager"); } public List 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 i) { User u = UserTransformer.transformIUser2User(i); userManager.saveUser(u); } }
IUser.java定义的接口,相互传递参数:
package com.sillycat.core.webservice.model; import java.io.Serializable; import org.apache.commons.lang.builder.ToStringBuilder; public class IUser implements Serializable { private static final long serialVersionUID = 1993559722178981779L; private Integer id; private String name; public IUser() { } public IUser(String name) { this.name = name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String toString() { return new ToStringBuilder(this).append("name", this.name).append("id", this.id).toString(); } }
UserTransformer.java转换类,接口和内部类的转换:
package com.sillycat.core.webservice.transformer; import com.sillycat.core.model.User; import com.sillycat.core.webservice.model.IUser; public class UserTransformer { public static IUser transformUser2IUser(User u) { IUser i = new IUser(); i.setId(u.getId()); i.setName(u.getName()); return i; } public static User transformIUser2User(IUser i) { User u = new User(); u.setId(i.getId()); u.setName(i.getName()); return u; } }
AxisPortProxyFactoryBean.java客户端调用时的基类:
package com.sillycat.plugin.webservice.axis; import javax.xml.namespace.QName; import javax.xml.rpc.Service; import javax.xml.rpc.encoding.TypeMapping; import javax.xml.rpc.encoding.TypeMappingRegistry; import org.apache.axis.encoding.ser.BeanDeserializerFactory; import org.apache.axis.encoding.ser.BeanSerializerFactory; import org.springframework.remoting.jaxrpc.JaxRpcPortProxyFactoryBean; import com.sillycat.core.webservice.model.IUser; public class AxisPortProxyFactoryBean extends JaxRpcPortProxyFactoryBean { protected void postProcessJaxRpcService(Service service) { TypeMappingRegistry registry = service.getTypeMappingRegistry(); TypeMapping mapping1 = registry.createTypeMapping(); registerBeanMapping(mapping1, IUser.class, "IUser"); registry.register("http://schemas.xmlsoap.org/soap/encoding/", mapping1); } protected void registerBeanMapping(TypeMapping mapping, Class type, String name) { QName qName = new QName("urn:BeanService", name); mapping.register(type, qName, new BeanSerializerFactory(type, qName), new BeanDeserializerFactory(type, qName)); } }
最后单元测试一下就行了,UserManagerRemoteTest.java:
package com.sillycat.core.webservice; import com.sillycat.core.webservice.model.IUser; import com.sillycat.plugin.commons.base.ServiceTestBase; public class UserManagerRemoteTest extends ServiceTestBase { protected void setUp() throws Exception { super.setUp(); } public void testGetAddressById() { IUserManager iUserManager = (IUserManager) appContext .getBean("userManagerRemote"); IUser iUser = iUserManager.getUser(Integer.valueOf("1")); assertNotNull(iUser); System.out.println(iUser); } }