Pergunta

Como Eu posso acessar o ServletContext de dentro de um serviço JAX-WS web? , há uma maneira de acessar applicationContext, mais fácil do que isso?

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

Solução

Eu não acho que o serviço web deve ter de saber sobre web ou servlet contextos ou seu contexto de aplicação. Eu não vejo por que deveria ter saber nada disso. ele não deve ser muito mais passivo? Injectar o que ele precisa e deixá-lo fazer seu trabalho. As interações de serviço com um cliente deve ser baseada em um contrato definido na frente. Se ele tem que obter valores desconhecidos a partir de um contexto de algum tipo, como é que os clientes sabem o que precisa ser definida ou como configurá-lo?

Eu iria mais longe e dizer que um serviço web deve ser um wrapper para uma interface de serviço da Primavera. É apenas mais uma escolha entre todas as formas possíveis para expô-lo. Seu serviço web deve fazer pouco mais do marechal e unmarshal a solicitação XML objetos / resposta e colaborar com os serviços da Primavera.

Outras dicas

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

Faça o seu feijão serviço web estender um feijão de primavera.

este

Gostaria de instalar um filtro que salva ServletContext antes de encadeamento em um ThreadLocal

De acordo com o JavaDoc para a classe SpringBeanAutowiringSupport, veja: http : //docs.spring.io/autorepo/docs/spring-framework/3.0.x/api/org/springframework/web/context/support/SpringBeanAutowiringSupport.html

Leia a nota:. No final do javadoc

A pergunta original, pode, na verdade, ser a maneira que esta deve ser implementada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top