[
https://issues.apache.org/jira/browse/AXIS2-4662?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12850106#action_12850106
]
Stephan van Hugten edited comment on AXIS2-4662 at 3/26/10 3:48 PM:
--------------------------------------------------------------------
You have a very valid point which I didn't consider yet. To address this use
case I modified the Spring configuration and also the AxisServer class.
The Spring configuration now looks like this:
<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">
<list>
<value>com.example.poc.webservice.WeatherSpringService</value>
<ref bean="DependantWeatherService" />
</list>
</property>
</bean>
<bean name="DependantWeatherService"
class="com.example.poc.webservice.DependantWeatherSpringService">
<property name="weatherSpringService" ref="WeatherService" />
</bean>
<bean name="WeatherService"
class="com.example.poc.webservice.WeatherSpringService" />
You can put a class name literal in the List or refer to a Spring bean like the
one configured below the run-time. In the AxisRunner.setDeployedWebservices
method it call the regular AxisServer.deployService(..) for class names and a
new deployService(bean instance) method for the Spring beans. It looks like
this:
public void deployService(Object serviceImplementation) throws AxisFault {
String serviceClassName = serviceImplementation.getClass().getName();
if (configContext == null) {
configContext = getConfigurationContext();
}
AxisConfiguration axisConfig = configContext.getAxisConfiguration();
AxisService service = AxisService.createService(serviceClassName,
axisConfig);
axisConfig.addService(service);
configContext.addContextListener(
new SpringContextListener(serviceImplementation));
if (startOnDeploy) {
start();
}
}
The different between the regular deployService is that it extracts the
serviceClassName from the object and that it sets the SERVICE_OBJECT property
on the appropriate ServiceContext via a ContextListener (The
SpringContextListener class) so that the bean will be used as implementation
class.
was (Author: stephan.vanhugten):
You have a very valid point which I didn't consider yet. To address this
use case I modified the Spring configuration and also the AxisServer class.
The Spring configuration now looks like this:
<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">
<list>
<value>com.example.poc.webservice.WeatherSpringService</value>
<ref bean="DependantWeatherService" />
</list>
</property>
</bean>
<bean name="DependantWeatherService"
class="com.example.poc.webservice.DependantWeatherSpringService">
<property name="weatherSpringService" ref="WeatherService" />
</bean>
<bean name="WeatherService"
class="com.example.poc.webservice.WeatherSpringService" />
You can put a class name literal in the List or refer to a Spring bean like the
one configured below the run-time. In the AxisRunner.setDeployedWebservices
method it call the regular AxisServer.deployService(..) for class names and a
new deployService(bean instance) method for the Spring beans. It looks like
this:
public void deployService(Object serviceImplementation) throws AxisFault {
String serviceClassName = serviceImplementation.getClass().getName();
if (configContext == null) {
configContext = getConfigurationContext();
}
AxisConfiguration axisConfig = configContext.getAxisConfiguration();
AxisService service = AxisService.createService(serviceClassName,
axisConfig);
axisConfig.addService(service);
getConfigurationContext().setProperty(ServiceContext.SERVICE_OBJECT,
serviceImplementation);
if (startOnDeploy) {
start();
}
}
The different between the regular deployService is that it extracts the
serviceClassName from the object and that it sets the SERVICE_OBJECT property
on the context so that the bean will be used as implementation class. If you
like you can also implement it like this in the AxisRunner:
if (webservice instanceof String) { //Just classname
this.deployService(webservice.toString());
} else { //It's a bean
this.deployService(webservice.getClass().getName());
getConfigurationContext().setProperty(ServiceContext.SERVICE_OBJECT,
webservice);
}
> 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: [email protected]
For additional commands, e-mail: [email protected]