[ 
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]

Reply via email to