zoukankan      html  css  js  c++  java
  • 信步漫谈之Axis2—Spring装配

    主要介绍 axis2 接口在 spring 项目中的整合配置。

    使用jar包:axis2-1.6.2、spring2.5.6

    目录结构:

    image

    关键代码:

    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 的接口类对象。

  • 相关阅读:
    jquery toggle(listenerOdd, listenerEven)
    struts quick start
    hdu 1518 Square (dfs)
    hdu 2544 最短路 (最短路径)
    hdu 1754 I Hate It (线段树)
    hdu 1856 More is better (并查集)
    hdu 1358 Period (KMP)
    hdu 2616 Kill the monster (DFS)
    hdu 2579 Dating with girls(2) (bfs)
    zoj 2110 Tempter of the Bone (dfs)
  • 原文地址:https://www.cnblogs.com/alfredinchange/p/5398614.html
Copyright © 2011-2022 走看看