Pregunta

Similar a Cómo ¿Puedo acceder a ServletContext desde un servicio web JAX-WS? , ¿hay alguna forma de acceder a applicationContext, más fácil que esto?

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;
    }
}
¿Fue útil?

Solución

No creo que el servicio web deba conocer los contextos web o de servlet 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? Inyecte lo que necesita y deje que haga su trabajo. Las interacciones de servicio con un cliente deben basarse en un contrato definido por adelantado. Si tiene que obtener valores desconocidos de algún tipo de contexto, ¿cómo sabrán los clientes qué se debe configurar o cómo configurarlo?

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

Otros consejos

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

Haga que su servicio web bean extienda un bean spring.

me gusta this

Instalaría un filtro que guarda ServletContext antes de encadenar en un ThreadLocal

De acuerdo con el JavaDoc para la clase SpringBeanAutowiringSupport, vea: http : //docs.spring.io/autorepo/docs/spring-framework/3.0.x/api/org/springframework/web/context/support/SpringBeanAutowiringSupport.html

Lee la NOTA: al final del javadoc.

La pregunta original, de hecho, puede ser la forma en que se debe implementar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top