Frage

Ähnlich wie Wie kann ich die ServletContext aus einem JAX-WS Web-Service zugreifen? , ist es eine Möglichkeit, application zuzugreifen, einfacher als das?

import javax.annotation.Resource;
import javax.jws.WebService;
import javax.servlet.ServletContext;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

@WebService
public class MyWebService {
    // boilerplate code begins :(

    @Resource
    private WebServiceContext context;
    private WebApplicationContext webApplicationContext = null;

    /**
     * @return
     * @throws IllegalStateException
     */
    private WebApplicationContext getWebApplicationContext()
            throws IllegalStateException {
        if (webApplicationContext != null)
            return webApplicationContext;
        ServletContext servletContext =
                (ServletContext) context.getMessageContext().get(
                        MessageContext.SERVLET_CONTEXT);
        webApplicationContext =
                WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
        return webApplicationContext;
    }
}
War es hilfreich?

Lösung

Ich glaube nicht, dass der Web-Service weiß über Web oder Servlet-Kontexte oder dessen Anwendungskontext müssen sollte. Ich sehe nicht, warum es sollte irgendetwas davon wissen müssen. Sollte es nicht weit mehr passiv sein? Injizieren, was er braucht und lassen Sie es seine Arbeit tun. Die Service-Interaktionen mit einem Kunden sollten vorne definiert auf einem Vertrag beruht. Ist dies der Fall unbekannte Werte von einem Zusammenhang von einer Art zu erhalten, wie werden die Kunden wissen, was eingestellt werden muss, oder, wie es eingerichtet?

Ich würde noch weiter gehen und sagen, dass ein Web-Service ein Wrapper für eine Frühlings-Service-Schnittstelle sein sollte. Es ist nur noch eine Wahl unter allen möglichen Möglichkeiten, es zu belichten. Ihr Web-Service sollte wenig mehr tun, als Marschall und entpacken Sie die XML Request / Response-Objekte und die Zusammenarbeit mit Feder Service.

Andere Tipps

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;


@WebService( 
    endpointInterface = "Bla", 
    targetNamespace = "http://bla/v001", 
    wsdlLocation = "WEB-INF/wsdl/bla.wsdl",    
    serviceName = "BlaService",
    portName = "BlaPort")
public class BlaWs extends SpringBeanAutowiringSupport implements BlaPort {

  @Autowired
  @Qualifier("dao") 
  private Dao dao;
  ...
}

Machen Sie Ihre Web-Service-Bohne eine Feder Bohne erweitern.

diese

würde ich einen Filter installieren, die ServletContext speichert, bevor in einem Threadverkettungs

Nach der JavaDoc für die SpringBeanAutowiringSupport Klasse finden Sie unter: http : //docs.spring.io/autorepo/docs/spring-framework/3.0.x/api/org/springframework/web/context/support/SpringBeanAutowiringSupport.html

Lesen Sie

den. HINWEIS: am Ende des javadoc

Die ursprüngliche Frage, kann in der Tat kann die Art und Weise, dass diese umgesetzt werden sollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top