本章主要介绍axis2接口在spring项目中的整合配置。
使用jar包:axis2-1.6.2 spring2.5.6
目录结构:
关键代码:
package com.alfred.bean; public class PersonBean { private String username; public PersonBean() { } public PersonBean(String username) { this.username = username; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String say(String str) { return username + " say:" + str; } }
PersonBean.java
package com.alfred.service; import org.apache.axis2.AxisFault; import com.alfred.bean.PersonBean; public class SoapService { private PersonBean personBean; public String sayHello(String username) throws AxisFault { personBean.setUsername(username); return personBean.say("hello"); } public String saySorry() { return personBean.say("sorry"); } public PersonBean getPersonBean() { return personBean; } public void setPersonBean(PersonBean personBean) { this.personBean = personBean; } }
SoapService.java
package com.alfred.service; import org.apache.axis2.AxisFault; import org.apache.axis2.ServiceObjectSupplier; import org.apache.axis2.description.AxisService; import org.apache.axis2.description.Parameter; import org.apache.axis2.i18n.Messages; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; /** * 可能出现Axis2 spring bean not found 或者 Spring applicationContext not found。 * * 解决办法:构建自己的ServiceObjectSupplier,实现接口ServiceObjectSupplier,同时也实现Spring的ApplicationContextAware接口 * * @author alfred * */ public class SoapServiceSupplier implements ServiceObjectSupplier, ApplicationContextAware { private static ApplicationContext ctx; public Object getServiceObject(AxisService axisService) throws AxisFault { System.out.println("in getServiceObject"); Parameter springBeanName = axisService.getParameter("SpringBeanName"); String beanName = ((String) springBeanName.getValue()).trim(); if (beanName != null) { if (ctx == null) throw new AxisFault("applicationContext is NULL! "); if (ctx.getBean(beanName) == null) throw new AxisFault("Axis2 Can‘t find Spring Bean: " + beanName); return ctx.getBean(beanName); } else { throw new AxisFault(Messages.getMessage("paramIsNotSpecified", "SERVICE_SPRING_BEANNAME")); } } public void setApplicationContext(ApplicationContext ctx) throws BeansException { this.ctx = ctx; } }
SoapServiceSupplier.java
package com.alfred.client; import javax.xml.namespace.QName; import org.apache.axis2.AxisFault; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; import org.apache.axis2.rpc.client.RPCServiceClient; public class ServiceClient { public static void main(String args[]) throws AxisFault { sendAxis2(); } /** * 发送axis2的接口信息 * @throws AxisFault */ private static void sendAxis2() throws AxisFault { // 使用RPC方式调用WebService RPCServiceClient serviceClient = new RPCServiceClient(); Options options = serviceClient.getOptions(); // 指定调用WebService的URL EndpointReference targetEPR = new EndpointReference( "http://127.0.0.1:8080/aws/services/mySoapService"); options.setTo(targetEPR); // 指定sayHello方法的参数值,如果有多个,继续往后面增加即可 Object[] opAddEntryArgs = new Object[] { "alfred" }; // 指定sayHello方法返回值的数据类型的Class对象 Class[] classes = new Class[] { String.class }; // 在创建QName对象时,QName类的构造方法的第一个参数表示WSDL,文件的命名空间名,也就是<wsdl:definitions>元素的targetNamespace属性值 // 第二个参数是要调用的方法名 QName opAddEntry = new QName("http://service.alfred.com", "saySorry"); // 返回参数类型,这个和axis1有点区别 // invokeBlocking方法有三个参数: // 第一个参数的类型是QName对象,表示要调用的方法名; // 第二个参数表示要调用的WebService方法的参数值,参数类型为Object[]; // 第三个参数表示WebService方法的返回值类型的Class对象,参数类型为Class[]; // 当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{} // 如果被调用的WebService方法没有返回值,应使用RPCServiceClient类的invokeRobust方法, // 该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同 Object ret = serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0]; System.out.println(ret); } }
ServiceClient.java
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> <bean id="applicationContext" class="org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder" /> <bean class="com.alfred.service.SoapServiceSupplier"></bean> <bean id="soapService" class="com.alfred.service.SoapService"> <property name="personBean" ref="personBean" /> </bean> <bean id="personBean" class="com.alfred.bean.PersonBean"> <!-- 设置username的初始值 --> <property name="username"> <value>john</value> </property> </bean> </beans>
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <serviceGroup> <!-- 可以指定发布多个service --> <service name="mySoapService"> <description>axis2与spring集成案例</description> <!-- 通过ServiceObjectSupplier参数指定SpringServletContextObjectSupplier类来获得Spring的ApplicationContext对象 --> <parameter name="ServiceObjectSupplier"> org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier <!-- com.alfred.service.SoapServiceSupplier --> </parameter> <!-- SpringBeanName固定的不能改 soapService是spring中注册的实现类得id --> <parameter name="SpringBeanName">soapService</parameter> <!-- 服务级消息接收器 --> <messageReceivers> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" /> </messageReceivers> </service> </serviceGroup>
services.xml
<?xml version="1.0" encoding="UTF-8"?> <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"> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <context-param> <description>配置spring读取的xml文件,param-name是spring规定,spring自动加载以下内容</description> <param-name>contextConfigLocation</param-name> <param-value> classpath*:applicationContext*.xml </param-value> </context-param> <!--Axis2 config start--> <display-name>Apache-Axis2</display-name> <servlet> <servlet-name>AxisServlet</servlet-name> <servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class> <!--<init-param>--> <!--<param-name>axis2.xml.path</param-name>--> <!--<param-value>/WEB-INF/conf/axis2.xml</param-value>--> <!--<param-name>axis2.xml.url</param-name>--> <!--<param-value>http://localhost/myrepo/axis2.xml</param-value>--> <!--<param-name>axis2.repository.path</param-name>--> <!--<param-value>/WEB-INF</param-value>--> <!--<param-name>axis2.repository.url</param-name>--> <!--<param-value>http://localhost/myrepo</param-value>--> <!--</init-param>--> <load-on-startup>1</load-on-startup> </servlet> <servlet> <servlet-name>AxisAdminServlet</servlet-name> <servlet-class> org.apache.axis2.webapp.AxisAdminServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>AxisServlet</servlet-name> <url-pattern>/servlet/AxisServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>AxisServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>AxisServlet</servlet-name> <url-pattern>*.jws</url-pattern> </servlet-mapping> <!--Axis2 end--> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
web.xml
spring与axis2集成的关键就是services.xml文件中由原先的接口类地址指定改为注入spring的接口类对象。
时间: 2024-10-14 09:19:17