2009-03-02 14 views
9

Similar a How can I access the ServletContext from within a JAX-WS web service?, ¿hay alguna manera de acceder a applicationContext, más fácil que esto?¿Cómo puedo acceder al ApplicationContext desde un servicio web 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; 
    } 
} 

Respuesta

1

no creo que el servicio web debería tener que saber sobre web o servlet contextos o su contexto de aplicación. No veo por qué debería tener que saber nada de eso. ¿No debería ser mucho más pasivo? Inyecta lo que necesita y deja que haga su trabajo. Las interacciones del servicio con un cliente deben basarse en un contrato definido de antemano. Si tiene que obtener valores desconocidos de un contexto de algún tipo, ¿cómo sabrán los clientes qué se debe establecer o cómo establecerlo?

Ir más allá y decir que un servicio web debe ser un contenedor para una interfaz de servicio de primavera. Es solo una opción más entre todas las formas posibles de exponerlo. Su servicio web debería hacer poco más que reunir y desarticular los objetos de solicitud/respuesta XML y colaborar con los servicios de Spring.

+0

Bueno, entonces ¿cómo puedo colaborar con los servicios de Spring, si no puedo decir: appContext.getBean ('myBean')? – pihentagy

+0

Inyectarlo a través de setter o constructor. La inyección de dependencia significa "no nos llame, lo llamaremos". Sus objetos no tienen que tener el contexto de la aplicación para obtener lo que necesitan. – duffymo

+0

No puedes. Si pruebo mi servicio web en glassfish, se crea un nuevo servicio web, y no está configurado: -o Eso fue una depuración de un día para obtener este conocimiento :( – pihentagy

0

Me gustaría instalar un filtro que salva ServletContext antes de encadenar en una ThreadLocal

1

Haga que su servicio web extienda un grano de primavera.

como 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 Gracias por señalarme en la dirección de 'SpringBeanAutowiringSupport'. He estado luchando para obtener Glassfish renunciar a su gestión de JAX-WS y dejar que Spring lo haga. Esta es una solución mucho más fácil y permite que Spring se concentre en las cosas en las que es bueno. –

+0

I He intentado que la solución funcione, pero SpringBeanAutowiringSupport no parece tener ningún efecto en mi servicio web. http://stackoverflow.com/questions/12869014/web-service-exposed-by-extinging-springbeanautowiringsupport-is-failing-to-injec – AR3Y35

Cuestiones relacionadas