Axis2之Spring装配

本章主要介绍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

Axis2之Spring装配的相关文章

Spring 装配Bean

Spring 装配Bean 装配解释: 创建应用对象之间协作关系的的行为通常称为装配(wiring),这也是依赖注入的本质 依赖注入是Spring的基础要素 一 : 使用spring装配Bean基础介绍 1 :声明Bean Bean的概念:beans 本身是一个大工厂,beans中的每一个bean就等于定义了一个组件,每个组件中就是我们具体的某个功能 1.1 :创建Spring 配置Spring是很重要的,如果没有配置Spring,那么就等于声明了一个空的容器,毫无意义. 通过配置Spring容

Spring装配Bean的过程补充

对上一篇的<Spring装配Bean的过程>的过程说一下,不然真产生了误区. 误区在哪里呢?那就是spring bean的作用域问题. 说哈常用的两种作用域:默认是scope = singletonsingleton:在每个Spring IoC容器中一个bean定义对应一个对象实例. prototype:一个bean定义对应多个对象实例,每次获取bean就是实例化新的bean. 下面说重点了: 当scope=singleton,即默认情况,会在容器初始化时实例化.但我们可以指定Bean节点的l

Spring装配Bean的过程

首先说一个概念:“懒加载” 懒加载:就是我们在spring容器启动的是先不把所有的bean都加载到spring的容器中去,而是在当需要用的时候,才把这个对象实例化到容器中. spring配置文件中bean默认是lazy-init=“false”为非懒加载.下面具体说明. 1.默认情况下bean实例化过程: AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("/beans.xml"); //随着spri

spring装配---处理自动装配的歧义性

一.歧义性 当我们使用spring的注解进行自动装配bean时,如果不仅有一个bean能够匹配结果的话,会抛出NoUniqueBeanDefinitionException: 例如本例中 当spring尝试为DuckBasket类注入duck属性时就会抛出该异常 因为greenDuck类,和redDuck类都实现了Duck接口,换言之,Duck类型有两个实现类,也就是有两个可以匹配的bean造成了歧义性,spring不知道该注入哪个bean给该属性. 二.解决方法 (1)标识首选的bean--通

编码剖析Spring装配基本属性的原理

上回我们已经讲到了Spring依赖注入的第一种方式,现在我们来详解第二种方式,须知这一切都是以编码剖析Spring依赖注入的原理案例为基础的. 我们将Spring的配置文件——beans.xml的内容改为: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=&quo

Spring装配bean--01组件扫描和自动装配

Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系 Spring提供了三种主要的装配机制: 在XML中进行显式配置 在Java中进行显式配置 隐式的bean发现机制和自动装配 1自动化装配beanSpring从两个角度来实现自动化装配: 组件扫描(component scanning):Spring 会自动发现应用上下文中所创建的bean 自动装配(autowired):Spring自动满足bean之间的依赖@Autowired 开启组件扫描的2种方法: XML中配置

Spring装配bean--02通过Java代码装配bean

Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系 Spring提供了三种主要的装配机制: 在XML中进行显式配置 在Java中进行显式配置 隐式的bean发现机制和自动装配 2在Java中显式配置 尽管在很多场景下通过组件扫描和自动装配实现Spring的自动化装配是更为推荐的方式,但是当你要将第三方库中的组件装配到你的应用中,这时就必须显式的配置bean 显式配置包括:Java和XML,我更推荐使用Java类配置,就像上文中的JavaConfig那样 JavaCon

spring装配集合

前面我们已经了解了如何使用spring装备简单的属性(使用value属性)和引用其他bean的属性(使用ref属性).但是value和ref仅在Bean的属性值是单个值的情况下才有用.当bean的属性值是复数时-----如果属性的类型是集合. 当配置集合类型的bean属性时,spring提供了4种类型的集合配置元素,如下. 集合元素 用途 <list> 装配list类型的值,允许重复 <set> 装配set类型,不允许重复 <map> 装配map类型的值,名称和值可以是

Spring装配Bean---使用xml配置

声明Bean Spring配置文件的根元素是<beans>. 在<beans>元素内,你可以放所有的Spring配置信息,包括<bean>元素的声明. 除了Beans命名空间,Spring的核心框架总共自带了10个命名空间配置:  命名空间 用途  aop     为声明切面以及将@AspectJ注解的类代理为Spring切面提供了配置元素  beans     支持声明Bean和装配Bean,是Spring最核心也是最原始的命名空间  context 为配置Sprin