axis-java-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Stephan van Hugten (JIRA)" <j...@apache.org>
Subject [jira] Issue Comment Edited: (AXIS2-4662) Improve Spring Integration for Axis2
Date Tue, 30 Mar 2010 13:00:27 GMT

    [ https://issues.apache.org/jira/browse/AXIS2-4662?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12851383#action_12851383
] 

Stephan van Hugten edited comment on AXIS2-4662 at 3/30/10 1:00 PM:
--------------------------------------------------------------------

After some tinkering I have come up with this. Dependencies are injected by using @Resource:

ApplicationContext.xml:

  <context:component-scan base-package="com.example">
  	<context:include-filter type="annotation" expression="javax.jws.WebService"/>
  </context:component-scan>
  
  <bean class="com.example.poc.beanprocessor.WebServiceAnnotationBeanPostProcessor" />

BeanPostProcessor:

public class WebServiceAnnotationBeanPostProcessor extends CommonAnnotationBeanPostProcessor
implements
		ApplicationContextAware {

	/**
	 * 
	 */
	private static final long serialVersionUID = -4394340453143619407L;
	private AxisServer axisServer;
	private ApplicationContext applicationContext;

	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException
{
		if (bean.getClass().isAnnotationPresent(WebService.class)) {
			if (axisServer == null) {
				Map beans = applicationContext.getBeansOfType(AxisServer.class);
				if (beans.isEmpty()) {
					throw new NoSuchBeanDefinitionException("No Axis2 engine configured in the Spring context!");
				} else {
					// TODO Can there be more than 1?
					axisServer = (AxisServer) beans.values().iterator().next();
				}
			}
			try {
				//FIXME: Use annotation configured servicename
				axisServer.deployService(bean);
			} catch (AxisFault e) {
				throw new BeanCreationException(e.getMessage(), e);
			}
		}
		return bean;
	}

	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
{
		this.applicationContext = applicationContext;
	}
}

      was (Author: stephan.vanhugten):
    After some tinkering I have come up with this:

ApplicationContext.xml:

  <context:component-scan base-package="com.example">
  	<context:include-filter type="annotation" expression="javax.jws.WebService"/>
  </context:component-scan>
  
  <bean class="com.example.poc.beanprocessor.WebServiceAnnotationBeanPostProcessor" />

BeanPostProcessor:

public class WebServiceAnnotationBeanPostProcessor extends CommonAnnotationBeanPostProcessor
implements
		ApplicationContextAware {

	/**
	 * 
	 */
	private static final long serialVersionUID = -4394340453143619407L;
	private AxisServer axisServer;
	private ApplicationContext applicationContext;

	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException
{
		if (bean.getClass().isAnnotationPresent(WebService.class)) {
			if (axisServer == null) {
				Map beans = applicationContext.getBeansOfType(AxisServer.class);
				if (beans.isEmpty()) {
					throw new NoSuchBeanDefinitionException("No Axis2 engine configured in the Spring context!");
				} else {
					// TODO Can there be more than 1?
					axisServer = (AxisServer) beans.values().iterator().next();
				}
			}
			try {
				//FIXME: Use annotation configured servicename
				axisServer.deployService(bean);
			} catch (AxisFault e) {
				throw new BeanCreationException(e.getMessage(), e);
			}
		}
		return bean;
	}

	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
{
		this.applicationContext = applicationContext;
	}
}
  
> Improve Spring Integration for Axis2
> ------------------------------------
>
>                 Key: AXIS2-4662
>                 URL: https://issues.apache.org/jira/browse/AXIS2-4662
>             Project: Axis2
>          Issue Type: Improvement
>          Components: kernel
>    Affects Versions: 1.5.1
>            Reporter: Stephan van Hugten
>         Attachments: POC_Axis2.zip
>
>
> I wanted to create an application that has tight integration between Axis2 webservices
and Spring. There is already a solution presented at the Axis2 website, http://ws.apache.org/axis2/1_5_1/spring.html,
but I found that solution very cumbersome in my opinion and doesn't support the JSR 181 annotations.
> With my proposed approach it is possible to fully integrate the Axis2 run-time with a
spring container, whether it is stand-alone or in a web server such as Tomcat. This solution
also supports both the JSR 181 annotated classes and the regular AAR-files.
> To fully integrate Axis2 with Spring I have overridden the SimpleAxis2Server class used
by the standard stand-alone run-time. A full listing of this class is included in my example
application.
> The important stuff is in line 21 up to 36. First it determines the absolute path of
the repository and config location parameters. Then it passes those to the AxisRunner constructor
(lines 10 to 13) and starts the server. After it successfully starts the Axis2 server it returns
the bean to the Spring Container.
> After the creation of the bean it will invoke setDeployedWebservices (lines 46 to 51)
which will cycle through the passed webservice classes and deploy them at the created run-time.
That's it! No additional configuration or packaging is needed. If the Spring container starts
up, so does the Axis2 run-time and the webservices get deployed.
> The needed configuration in order to integrate Axis2 is quite simple. Below is a complete
listing of my applicationContext.xml (Spring 2.5.6):
> <?xml version="1.0" encoding="UTF-8"?>
> <beans xmlns="namespace stuff">
>   
>   <bean name="axisServer" class="com.example.poc.server.AxisRunner" factory-method="create"
scope="singleton">
>   	<constructor-arg value="repository" />
>   	<constructor-arg value="config/axis2.xml" />
>   	<property name="deployedWebservices">
>   		<props>
>   			<prop key="WeatherSpringService">
> com.example.poc.webservice.WeatherSpringService
> </prop>
>   		</props>
>   	</property>
>   </bean>
> </beans>
> With a little bit more effort I think it's also possible to integrate this solution with
the Spring component scan, making it possible to annotate the webservice classes and the run-time
with @component. I have tested my war-project with Tomcat 6 and Sun Webserver 7.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: java-dev-unsubscribe@axis.apache.org
For additional commands, e-mail: java-dev-help@axis.apache.org


Mime
View raw message