Question

Similaire à Comment puis-je accéder au ServletContext à partir d'un service Web JAX-WS? , existe-t-il un moyen d'accéder à applicationContext plus facilement que cela?

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;
    }
}
Était-ce utile?

La solution

Je ne pense pas que le service Web doive avoir à connaître les contextes Web ou de servlet ni son contexte d'application. Je ne vois pas pourquoi il devrait avoir besoin de savoir cela. Ne devrait-il pas être beaucoup plus passif? Injectez ce dont il a besoin et laissez-le faire son travail. Les interactions de service avec un client doivent être basées sur un contrat défini au préalable. S'il doit obtenir des valeurs inconnues dans un contexte quelconque, comment les clients sauront-ils ce qui doit être défini ou comment le définir?

Je voudrais aller plus loin et dire qu'un service Web devrait être un wrapper pour une interface de service Spring. C'est juste un choix de plus parmi toutes les manières possibles de l'exposer. Votre service Web ne devrait faire que marshaler et dissocier les objets requête / réponse XML et collaborer avec les services Spring.

Autres conseils

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

Faites en sorte que votre haricot de service Web prolonge un haricot de printemps.

comme ceci

J'installerais un filtre qui enregistre ServletContext avant de chaîner un ThreadLocal

Selon le JavaDoc de la classe SpringBeanAutowiringSupport, voir: : //docs.spring.io/autorepo/docs/spring-framework/3.0.x/api/org/springframework/web/context/support/SpringBeanAutowiringSupport.html

Lisez le NOTA: à la fin du javadoc.

La question initiale pourrait en fait être la manière dont cela devrait être mis en œuvre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top