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

  • 相关阅读:
    1002CSP-S模拟测试赛后总结
    「题解」:X国的军队
    1001CSP-S模拟测试赛后总结
    「题解」:联
    0929CSP-S模拟测试赛后总结
    「题解」:Kill
    「题解」:y
    Censoring【自动AC机】【水题毁我青春】【20190614】
    传说级快读
    针对值域与下标关系的总结
  • 原文地址:https://www.cnblogs.com/alfredinchange/p/5398614.html
Copyright © 2011-2022 走看看