2009-03-02 11 views
9

Podobny do How can I access the ServletContext from within a JAX-WS web service?, czy istnieje sposób dostępu do applicationContext, łatwiejszy niż to?Jak uzyskać dostęp do ApplicationContext z usługi WWW JAX-WS?

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; 
    } 
} 

Odpowiedz

1

Nie sądzę, że serwis internetowy powinien wiedzieć o internetowych lub serwletów kontekstach lub jego kontekstu aplikacji. Nie rozumiem, dlaczego powinien to wiedzieć. Czy nie powinien być bardziej pasywny? Wstrzykuj to, czego potrzebuje i pozwól mu wykonywać swoją pracę. Interakcje usług z klientem powinny być oparte na umowie zdefiniowanej z góry. Jeśli ma otrzymać nieznane wartości z jakiegoś kontekstu, w jaki sposób klienci będą wiedzieć, co należy ustawić lub jak je ustawić?

Chciałbym pójść dalej i powiedzieć, że usługa sieciowa powinna być opakowaniem dla interfejsu usługi Spring. To tylko jeden wybór spośród wszystkich możliwych sposobów na ujawnienie tego. Twoja usługa sieciowa powinna robić niewiele więcej, niż tylko marnować i odrzucać obiekty żądania/odpowiedzi XML i współpracować z usługami Spring.

+0

Więc, jak mogę współpracować z usługami Spring, jeśli nie mogę powiedzieć: appContext.getBean ("myBean")? – pihentagy

+0

Wprowadzić za pomocą suwaka lub konstruktora. Uzależnienie od iniekcji oznacza "nie dzwoń do nas, zadzwonimy do Ciebie". Twoje obiekty nie muszą mieć kontekstu aplikacji, aby uzyskać to, czego potrzebują. – duffymo

+0

Nie możesz. Jeśli przetestuję moją usługę sieciową pod Glassfish, zostanie utworzona nowa usługa sieciowa i nie jest ona skonfigurowana: -o To było jednodniowe debugowanie, aby uzyskać tę wiedzę :( – pihentagy

0

chciałbym zainstalować filtr, który zapisuje ServletContext przed łańcuchowym w ThreadLocal

1

Spraw, aby komponent bean usługi serwisowej przedłużył sprężystość.

jak this

8
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; 
    ... 
} 
+2

+1 Dziękuję za wskazanie mnie w kierunku 'SpringBeanAutowiringSupport' .Czy walczyłem o zdobywanie Glassfish zrezygnować z zarządzania JAX-WS i pozwolić Springowi na to. Jest to o wiele łatwiejsze rozwiązanie i pozwala Spring skupić się na rzeczach, w których jest dobra. –

+0

"Próbowałem uruchomić rozwiązanie, ale SpringBeanAutowiringSupport po prostu nie ma wpływu na moją usługę sieciową. http://stackoverflow.com/questions/12869014/web-service-exposed-by-extending-springbeanautowiringupport-is-failing-to-injec – AR3Y35