user829237
user829237

Reputation: 1769

Spring 3 MVC + Web Services (JAX-WS)

We have a Spring 3 MVC webapplication, and we are trying to expand it with Web Services.

I have now tried with JAX-WS Web-services, annotating WebService and WebMethod on the appropriate places. I do have a dispatcher mapped in my web.xml. This is the standard spring DispatcherServlet. And its config: dispatcher-servlet.xml is working perfectly fine for the MVC stuff.

The problem comes when I try to expose the WebServices. I do this by adding the following bean to the dispatcher-servlet.xml:

<bean class="org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter">
    <property name="baseAddress" value="http://localhost:8080/service/" />
</bean>

If this bean is added. Then the WebServices works perfectly, but all the MVC stuff stops working.

So my second try was to create 2 dispatchers. One named mvc-dispatcher and one webservice-dispatcher. Each of them mapped to respectivly /mvc and /ws. And then put only the SimpleJaxWsServiceExporter in the webservice-config and only the standard MVC stuff in the other one. But still the same problems. I can only get the MVC to work if I disable/comment-out the web-service dispatcher.

I cant belive this is supposed to be so complicated... What am I not getting?

Any help would be greatly appriciated. I cant find any decent tutorials doing JAX-WS and spring 3 MVC...

Thanks in advance!

Upvotes: 2

Views: 7298

Answers (2)

dardo
dardo

Reputation: 4970

I'm assuming by dispatcher you mean a spring dispatcher, I'd recommend against that. Just have the JAX-WS be a different servlet on it's own, i.e.

https://cxf.apache.org/docs/a-simple-jax-ws-service.html

Then if you need to allow Spring beans to be injected extend SpringBeanAutowiringSupport as in this example.

How to make an @WebService spring aware

Hope this helps!

Upvotes: 1

Valerio Vaudi
Valerio Vaudi

Reputation: 4532

You can use Apache CXF that implements the JAXWS Specification has a very good integration with Spring, actually CXF use behind the scenes Spring.

In practice you could proceed in this way:

in your web.xml you have configure the cxf servlet as below

<?xml version="1.0" encoding="UTF-8"?>
<web-app 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_3_0.xsd"
           version="3.0">

....
    <servlet>
        <description>Apache CXF Endpoint</description>
        <display-name>cxf</display-name>
        <servlet-name>cxf</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>cxf</servlet-name>
        <url-pattern>/ws/*</url-pattern>
    </servlet-mapping>


</web-app>

Apache CXF configuration

<?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:jaxws="http://cxf.apache.org/jaxws"
       xmlns:jaxrs="http://cxf.apache.org/jaxrs"
       xmlns:soap="http://cxf.apache.org/bindings/soap"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
                           http://cxf.apache.org/jaxws
                           http://cxf.apache.org/schemas/jaxws.xsd
                           http://cxf.apache.org/jaxrs
                           http://cxf.apache.org/schemas/jaxrs.xsd
                           http://cxf.apache.org/bindings/soap
                           http://cxf.apache.org/schemas/configuration/soap.xsd">

    <import resource="classpath:META-INF/cxf/cxf.xml" />
    <import resource="classpath*:META-INF/cxf/cxf-extension-*.xml" />
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>

    <jaxws:endpoint
            id="yourService"
            implementor="#yourService"
            address="/yourAddres">
    </jaxrs:server>
</beans>

your bean

 @Service
    @WebService(serviceName = "soapSvnClientService")
    public class SoapSvnClientService {

        @WebMethod(operationName = "service")
        public void service(@WebParam String param1,
                           @WebParam String param2){

    ....
    }

 }

I hope that this can help you

Upvotes: 1

Related Questions