This blog has moved to
http://blog.matthias-reining.com

Die bestehenden Artikel bleiben vorerst alle bei blogspot. Neue Artikel veröffentliche ich allerdings nur noch auf http://blog.matthias-reining.com

Dienstag, 17. Mai 2011

Inject a Spring Bean into a JAX-WS (Spring 2.0)

Der folgende Beispielcode ist eine mögliche Lösung für folgendes Problem:

Auf einem Tomcat (5.5 ß alles altes Legacy Zeugs ;-) ) soll ein Webservice veröffentlicht werden. Als Technik soll JAX-WS verwendet werden. Ein Spring-WS kommt wegen dem Contract-First Ansatz nicht in Frage.

Der Webservice:

@WebService(targetNamespace = "http://de.sourcecoding.webservice", name = "dummyws", serviceName = "dummyws")
public class WSDummy {
      public abcDTO getDummyData(int id) {
      // ...
}

Web.xml:
servlet>
        <servlet-name>JAX-WS</servlet-name>
        <description>Servlet for JAX-WS integration</description>
        <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
      </servlet>
     
      <servlet-mapping>
        <servlet-name>JAX-WS</servlet-name>
        <url-pattern>/ws</url-pattern>
      </servlet-mapping>


Funktioniert wunderbar J

Jetzt steht man allerdings vor dem Problem, wie man einen gemanagten Spring Bean hier injizieren kann. Mit folgenden Code ist dies Möglich:


@WebService(targetNamespace = "http://de.sourcecoding.webservice", name = "dummyws", serviceName = "dummyws")
public class WSDummy {
@Resource
      WebServiceContext wsCtxt;

      public AbcDTO getDummyData(int id) {

MessageContext msgCtxt = wsCtxt.getMessageContext();
            ServletContext sc = (ServletContext) msgCtxt
                        .get(MessageContext.SERVLET_CONTEXT);
            ApplicationContext context = WebApplicationContextUtils
                        .getWebApplicationContext(sc);
           
            // hole Spring Bean
            XYZService service = (XYZService) context.getBean("xXZService");
}

In dem Webservice wird per @Resource der Context injiziert. Über diesen Context kann dann der gesetzt Spring ApplicationContext gezogen werden. In diesem Beispiel wird der XYZService dann als gemanagter Spring Bean behandelt.