- 浏览: 697249 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (272)
- Struts1.x (7)
- 事务 (2)
- Hibernate (11)
- 数据库 (14)
- JavaScript&Ajax (43)
- JSP&Servlet (2)
- Flex (1)
- 其它 (9)
- Java (22)
- 框架集成 (1)
- WebService (3)
- Tomcat (3)
- 加密和安全登录 (13)
- 基于原型的JavaScript (0)
- JavaDoc和Java编码规范 (3)
- CAS (1)
- 加密 (1)
- Axis2 (10)
- Ext2.x (3)
- SSH整合 (2)
- Ext (0)
- 正则表达式 (1)
- 设计模式 (4)
- 对象序列化技术 (3)
- CVS (2)
- Struts2 (6)
- Spring 2.x (7)
- Spring Security (2)
- Java 课程 (20)
- 程序员之死 (1)
- 软件测试 (6)
- UML (5)
- NetBeans (1)
- cxf (1)
- JMS (13)
- 设计 (5)
- ibatis2.x (3)
- Oracle (1)
- WebSphere (7)
- 概要设计 (1)
- DB2 (10)
- PowerDesigner (0)
- 软件工程 (5)
- rose (1)
- EA (1)
- LDAP (7)
- Portal&Portlet (3)
- MQ (10)
- ESB (4)
- EJB (2)
- JBoss (2)
最新评论
-
typeRos:
只有配置文件,没有代码么大神
Spring实现IBMMQ的JMS消息发布/订阅模式 -
panamera:
如果ActiveMQ服务器没有启动,这个时候消息生产者使用Jm ...
Spring JMSTemplate 与 JMS 原生API比较 -
lian819:
顶1楼, 引用文件, 配置属性, 太方便了
EXTJS 同步和异步请求 -
wilhard:
说得清楚明白
<%@ include file=""%>与<jsp:include page=""/>区别 -
刘琛颖:
总结的很好。受益了
javascript 父窗口(父页面)— 子窗口 (子页面)互相调用的方法
This document is a guide on how to use Axis2 with the Spring Framework
Content
- Introduction
- Configuring Axis2 to be Spring aware
- Programming Model
- Simple Spring config example
- With a ServletContext
- Without a ServletContext
- Putting it all together
- Spring inside an AAR
- The Spring inside an AAR layout
- The Spring inside an AAR init class
- Known issues running Spring inside the AAR
Introduction
The idea behind Axis2 and Spring integration is that Axis2 simply needs to have Spring supply one of its pre-loaded beans to the Axis2 Message Receiver defined in the AAR services.xml . While Axis2 typically uses reflection to instantiate the ServiceClass defined in the services.xml that the Message Receiver will use, alternatively one can define a ServiceObjectSupplier that will supply the Object.
This guide will show how to use two separate ServiceObjectSupplier classes that are part of the Axis2 standard distribution: One for use with a ServletContext, and one without. Once configured, the web service itself acts like any other Spring wired bean. These Spring beans can be loaded any way desired, as Axis2 has no configuration file dependencies from Spring. Spring versions 1.2.6, 1.2.8 and 2.0 have been tested, but probably any version would work as only core functionality is required.
This guide assumes some basic knowledge of Axis2. See the User's Guide for more information.
Programming Model
From an Axis2 standpoint, two hooks are needed to be placed into the AAR services.xml: The ServiceObjectSupplier that hooks Axis2 and Spring together, and the name of Spring bean that Axis2 will use as the service. All Message Receivers are currently supported, as would be any Message Receiver that extends org.apache.axis2.receivers.AbstractMessageReceiver .
Simple Spring Config Example
For the purpose of this example, and for no other reason besides simplicity, we'll configure Spring via a WAR file's web.xml. Lets add a context-param and a listener:
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param>
Next we will show two examples of Spring's /WEB-INF/applicationContext.xml referenced in the web.xml listener - one using a ServletContext, and one without.
With a ServletContext
This 'with a ServletContext' example applicationContext.xml should be familiar to any Spring user:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- Axis2 Web Service, but to Spring, its just another bean that has dependencies --> <bean id="springAwareService" class="spring.SpringAwareService"> <property name="myBean" ref="myBean"/> </bean> <!-- just another bean / interface with a wired implementation, that's injected by Spring into the Web Service --> <bean id="myBean" class="spring.MyBeanImpl"> <property name="val" value="Spring, emerge thyself" /> </bean> </beans>
If the service is running in a Servlet Container, i.e., Axis2 will be able to get a hold of ServletContext, the services.xml for the example would be using SpringServletContextObjectSupplier such as:
<service name="SpringAwareService"> <description> simple spring example </description> <parameter name="ServiceObjectSupplier" locked="false">org.apache.axis2.extensions.spring.receivers.SpringServletContextObjectSupplier</parameter> <parameter name="SpringBeanName" locked="false">springAwareService</parameter> <operation name="getValue"> <messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/> </operation> </service>
While the above example uses RawXMLINOutMessageReceiver as its messageReceiver class, all Message Receivers are currently supported, as would be any Message Receiver that extends org.apache.axis2.receivers.AbstractMessageReceiver .
Without a ServletContext
In the case Axis2 can't get a ServletContext, ie another transport or running inside the AAR etc, you have the option of defining a bean that takes advantage of Spring's internal abilities (ApplicationContextAware interface, specifically) to provide an Application Context to Axis2, with a bean ref 'applicationContext' :
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- Configure spring to give a hook to axis2 without a ServletContext --> <bean id="applicationContext" class="org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder" /> <!-- Axis2 Web Service, but to Spring, its just another bean that has dependencies --> <bean id="springAwareService" class="spring.SpringAwareService"> <property name="myBean" ref="myBean" /> </bean> <!-- just another bean with a wired implementation, that's injected by Spring into the Web Service --> <bean id="myBean" class="spring.MyBeanImpl"> <property name="val" value="Spring, emerge thyself" /> </bean> </beans>
If the service is _NOT_ running in a Servlet Container, i.e., Axis2 will _NOT_ be able to get a hold of ServletContext or you prefer not to, the services.xml for the example would be using SpringAppContextAwareObjectSupplier such as:
<service name="SpringAwareService"> <description> simple spring example </description> <parameter name="ServiceObjectSupplier" locked="false">org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier</parameter> <parameter name="SpringBeanName" locked="false">springAwareService</parameter> <operation name="getValue"> <messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/> </operation> </service>
While the above example uses RawXMLINOutMessageReceiver as its messageReceiver class, all Message Receivers are currently supported, as would be any Message Receiver that extends org.apache.axis2.receivers.AbstractMessageReceiver .
In a 'without a ServletContext' environment, one way you could load the applicationContext.xml file is in a place that will be run once, upon start-up, execute:
import org.springframework.context.support.ClassPathXmlApplicationContext; public void createSpringAppCtx(ClassLoader cl) throws Exception { ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(new String[] {Constants.MY_PATH + "spring/applicationContext.xml"}, false); ctx.setClassLoader(cl); ctx.refresh();
Putting It All Together
From here, its just standard Axis2 coding, only now the service has Spring wiring capabilities. The implementation is the same whether using either SpringServletContextObjectSupplier or SpringAppContextAwareObjectSupplier. The service is below:
package spring; import org.apache.axiom.om.OMAbstractFactory; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.OMFactory; import org.apache.axiom.om.OMNamespace; import org.apache.axiom.om.OMText; public class SpringAwareService { private MyBean myBean = null; //spring 'injects' this implementation public void setMyBean(MyBean myBean) { this.myBean = myBean; } // The web service public OMElement getValue(OMElement ignore) { OMFactory factory= OMAbstractFactory.getOMFactory(); OMNamespace payloadNs= factory.createOMNamespace( "http://springExample.org/example1", "example1"); OMElement payload = factory.createOMElement("string", payloadNs); OMText response = factory.createOMText(this.myBean.emerge()); payload.addChild(response); return payload; } }
For those new to Spring, one of the ideas is that you program to an Interface, and the implementation is pluggable. This idea is referenced in the Spring config file above. Below is the interface:
package spring; /** Interface for Spring aware Bean */ public interface MyBean { String emerge(); }
Here's the implementation:
/** Spring wired implementation */ public class MyBeanImpl implements MyBean { String str = null; // spring 'injects' this value public void setVal(String s) { str = s; } // web service gets this value public String emerge() { return str; } }
Lastly here's the client - not really necessary for the example, other than for completeness:
package client; import java.io.StringWriter; import javax.xml.stream.XMLOutputFactory; import org.apache.axiom.om.OMAbstractFactory; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.OMFactory; import org.apache.axiom.om.OMNamespace; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; import org.apache.axis2.client.ServiceClient; public class TestClient { private static EndpointReference targetEPR = new EndpointReference( "http://localhost:8080/axis2/services/SpringAwareService"); /** * Simple axis2 client. * * @param args Main */ public static void main(String[] args) { try { OMFactory factory = OMAbstractFactory.getOMFactory(); OMNamespace omNs = factory.createOMNamespace( "http://springExample.org/example1", "example1"); OMElement method = factory.createOMElement("getValue", omNs); OMElement value = factory.createOMElement("Text", omNs); value.addChild(factory.createOMText(value, "Some String ")); method.addChild(value); ServiceClient serviceClient = new ServiceClient(); Options options = new Options(); serviceClient.setOptions(options); options.setTo(targetEPR); //Blocking invocation OMElement result = serviceClient.sendReceive(method); StringWriter writer = new StringWriter(); result.serialize(XMLOutputFactory.newInstance() .createXMLStreamWriter(writer)); writer.flush(); System.out.println("Response: " + writer.toString()); } catch (Exception ex) { ex.printStackTrace(); } } }
The examples above assumes that both the spring framework jar and the axis2-spring-*.jar are under WEB-INF/lib. In such a case, the classes shown in this tutorial need to be placed in a JAR under WEB-INF/lib. In this example the JAR layout is:
./mySpring.jar ./META-INF ./META-INF/MANIFEST.MF ./spring ./spring/MyBean.class ./spring/MyBeanImpl.class ./spring/SpringAwareService.class
Since all the user classes are in mySpring.jar in this example, the AAR merely contains the services.xml file:
./springExample.aar ./META-INF ./META-INF/MANIFEST.MF ./META-INF/services.xml
To run this example, make sure you have the axis2-spring*.jar that comes from the axis2-std-*-bin distro in the server side WEB-INF/lib, as well as the appropriate Spring jar - most will use the full spring.jar, but the minimum requirements are spring-core, spring-beans, spring-context and spring-web. Running the client, you should see this output:
Response: <example1:string xmlns:example1="http://springExample.org/example1" xmlns:tns="http://ws.apache.org/axis2">Spring, emerge thyself</example1:string>
Spring Inside an AAR
Frequently Axis2 users wish to run Spring inside the AAR. Here we show you how. There are four points to be aware of:
(A) You need to configure Spring to use the Axis2 Service Classloader. See the Known issues running Spring inside the AAR area.
(B) Its up to you to load Spring, though we give an example below.
(C) For reasons such as classloader isolation the SpringAppContextAwareObjectSupplier is the best choice.
(D) The springframework jar and axis2-spring-*.jar will be placed inside the AAR under the lib directory. Please MOVE the axis2-spring-*.jar from WEB-INF/lib to inside the AAR, as shown below - it will NOT work otherwise.
./springExample.aar ./META-INF ./META-INF/MANIFEST.MF ./META-INF/services.xml ./applicationContext.xml ./lib ./lib/axis2-spring-SNAPSHOT.jar ./lib/spring.jar ./spring ./spring/MyBean.class ./spring/MyBeanImpl.class ./spring/SpringAwareService.class ./spring/SpringInit.class
As explained in the Without a ServletContext section, likewise the 'Spring inside an AAR' config needs to hook Axis2 and Spring together via a Spring bean. Place the following in your Spring config file:
<!-- Configure spring to give a hook to axis2 without a ServletContext --> <bean id="applicationContext" class="org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder" />
One way to initialize Spring inside the AAR is to use the org.apache.axis2.engine.ServiceLifeCycle interface. Here we give an example:
package spring; import org.apache.axis2.engine.ServiceLifeCycle; import org.apache.axis2.context.ConfigurationContext; import org.apache.axis2.description.AxisService; import org.springframework.context.support.ClassPathXmlApplicationContext; public class SpringInit implements ServiceLifeCycle { /** * This will be called during the deployement time of the service. * irrespective * of the service scope this method will be called */ public void startUp(ConfigurationContext ignore, AxisService service) { try { System.out.println("Starting spring init"); ClassLoader classLoader = service.getClassLoader(); ClassPathXmlApplicationContext appCtx = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml"}, false); appCtx.setClassLoader(classLoader); appCtx.refresh(); System.out.println("spring loaded"); } catch (Exception ex) { ex.printStackTrace(); } } /** * This will be called during the system shut down time. * irrespective * of the service scope this method will be called */ public void shutDown(ConfigurationContext ctxIgnore, AxisService ignore) { } }
Here's the services.xml that now includes SpringInit and the SpringAwareService shown above. There is also the composite parameter which is needed when loading Spring in the AAR - see the Known issues running Spring inside the AAR area.
<serviceGroup> <!-- Invoke SpringInit on server startup and shutdown --> <service name="SpringAwareService" class="spring.SpringInit"> <description> simple spring example - inside the AAR </description> <!-- need the TCCL param when using spring inside the AAR --> <parameter name="ServiceTCCL" locked="false">composite</parameter> <parameter name="ServiceObjectSupplier" locked="false">org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier</parameter> <parameter name="SpringBeanName" locked="false">springAwareService</parameter> <operation name="getValue"> <messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/> </operation> </service> </serviceGroup>
The Axis2 classloader strategy by default does not permit Spring to run inside the AAR. To allow Spring to run inside the AAR, the 'composite' parameter is used in the services.xml as shown in the example above. The behavior of 'composite' was the default in the development cycle in between 1.0 and 1.1, but it resulted in the JIRA issue AXIS2-1214 - essentially problems with getting an initContext.lookup() handle inside the AAR. Spring users typically have little desire to use initContext.lookup() however, as they get their Datasources via org.springframework.jdbc.datasource.DriverManagerDataSource in an xml file or with annotations. For ejb home references and the like, Spring provides JndiObjectFactoryBean. While fully testing JndiObjectFactoryBean with ejb has not been done yet - if you do, please send a message to the axis users list - Datasources via Spring inside the AAR have been tested. Basically it works as typically done with Spring, though if you are passing Hibernate XML files you need to put them in a place where Spring will find them. The most flexible way is as follows, using logging in DEBUG mode to see where Spring will look in your jar / class locations:
<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="mappingLocations"> <value>classpath*:**/MyEntity.hbm.xml</value> </property> ... </bean>
评论
发表评论
-
Axis2 部署模型的六种部署特点提供更好的用户体验
2009-03-11 18:28 0下一代 SOAP 处理框架 级别: 中级 ... -
WebService大讲堂之Axis2(7):将Spring的装配JavaBean发布成WebSer
2009-03-04 19:18 2309原文地址:WebService大讲堂之Axis2(7):将Sp ... -
WebService大讲堂之Axis2(6):跨服务会话(Session)管理
2009-03-04 19:10 1515原文地址: WebService大讲堂之Axis2(6):跨服 ... -
WebService大讲堂之Axis2(5):会话(Session)管理
2009-03-04 19:00 2407原文地址: WebService大讲堂之Axis2(5):会话 ... -
WebService大讲堂之Axis2(4):二进制文件传输
2009-03-04 18:56 2584原文地址:WebService大讲堂之Axis2(4):二进制 ... -
WebService大讲堂之Axis2(3):使用services.xml文件发布WebServic
2009-03-04 18:35 3172原文地址:WebService大讲堂之Axis2(3):使用s ... -
WebService大讲堂之Axis2(2):复合类型数据的传递
2009-03-04 18:24 4076原文地址: WebService大讲堂之Axis2(2):复合 ... -
WebService大讲堂之Axis2(1):用POJO实现0配置的WebService
2009-02-21 19:07 6387原文地址:WebService大讲 ... -
使用SOAPMonitor
2009-01-03 22:34 5299能够监视SOAP消息对于Web Service开发者来 ... -
使用Axis的Eclipse插件开发WebSevice详解和注意事项
2008-12-21 17:30 10987在网上看到的由--呼必斯哈拉图--写的"Apache ...
相关推荐
简单例子:axis2整合spring发布webservice,以及session的管理
axis2与spring的集成,在application中配置要发布的Java类,然后配置aar文件,在aar打包文件中的services.xml要嵌入 <parameter name="ServiceObjectSupplier">org.apache.axis2.extensions.spring.receivers....
使用axis2与spring3进行集成,实现的webservice服务。 资料为myeclipse下的web工程,可解压后直接导入。 发布到tomcat6下运行。
本示例是在 Axis2 通过 外部 Spring容器 获取指定的实现Bean,以提供服务。全部自己写WSDL和服务实现类,不使用 Axis2提供的 Java2WSDL 和 WSDL2Java 工具
在hibernate spring项目基础上通过aixs2-1.4.1把程序发布成webService,包括aixs2以对象数组和AXIOM方式处理map,list的程序代码;和aixs2-1.4-1的jar包
spring3.2.5与axis2 1.6.2整合
axis2 和 spring3.2.0 的包。 这里http://blog.csdn.net/linlinv3/article/details/9017767详细讲解了 axis2 的用法
axis2和axis2+spring发布服务指南
axis2-spring-1.5.4.jar是axis2与spring整合时所需要的jar包
Axis2集成Spring发布WebServices服务
spring-framework-3.0.5.RELEASE-dependencies 好不容易找到了,赶紧分享一下 因为不能大于20M,共分了8个包,都是独立的,我列了目录,可以只下载需要的包,这是1号包: 1号包: edu.emory.mathcs.backport edu.oswego.cs....
axis2+spring2.5整合(webservice)
spring+axis2整合,项目下载之后就能使用,里面简单的编写的发布服务的代码,适合初学者使用
Axis2WebService与Spring的整合
Spring集成AXIS2的Web_service配置方法
Chapter 13, Enterprise Integration Patterns - Learn about some enterprise SOA deployment patterns that make use of the underlying Axis2 clustering infrastructure. Chapter 14, Axis2 Advanced Features ...
Spring整合axis2经典
springboot集成axis2-1.7.9部署和调用实例
axis2-idea-plugin-1.7.9
axis2+spring+ibatis整合的一个项目,含webservice文件传输