2011-01-28 2 views
4

Je dois injecter un bean ConversationScoped dans une servlet. i utiliser la balise simple standard @Inject et j'invoque la servlet avec le paramètre cid mais quand il invoque une méthode dans le bean injecté je reçois l'erreur suivante:Comment injecter des beans ConversationScoped dans un servlet

org.jboss.weld.context.ContextNotActiveException : WELD-001303 No active contexts for scope type javax.enterprise.context.ConversationScoped

Puis-je injecter ces haricots dans servlets ou je peux injecter uniquement les beans de session et de demande?

+0

Il semble qu'il n'y ait aucune conversation au moment où vous essayez d'utiliser votre bean @ConversationScoped. L'utilisez-vous dans la méthode doGet/doPost? Si oui, il devrait y avoir une conversation créée automatiquement pour la demande, ou commencée par vous "à la main" si vous le faites. – amorfis

Répondre

1

Dans une servlet, le contexte est le contexte de l'application, c'est pourquoi vous perdez la portée de la conversation. Voici une petite classe utilitaire que vous pouvez utiliser comme une classe anonyme et envelopper la demande avec si vous voulez avoir le support champ de conversation dans servlets ...

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServletRequest; 

import org.jboss.weld.Container; 
import org.jboss.weld.context.ContextLifecycle; 
import org.jboss.weld.context.ConversationContext; 
import org.jboss.weld.servlet.ConversationBeanStore; 


public abstract class ConversationalHttpRequest { 
    protected HttpServletRequest request; 


    public ConversationalHttpRequest(HttpServletRequest request) { 
     this.request = request; 
    } 

    public abstract void process() throws Exception; 

    public void run() throws ServletException { 
     try { 
      initConversationContext(); 
      process(); 
     } catch (Exception e) { 
      throw new ServletException("Error processing conversational request", e); 
     } finally { 
      cleanupConversationContext(); 
     } 
    } 

    private void initConversationContext() { 
     ConversationContext conversationContext = Container.instance().deploymentServices().get(ContextLifecycle.class).getConversationContext(); 
     conversationContext.setBeanStore(new ConversationBeanStore(request.getSession(), request.getParameter("cid"))); 
     conversationContext.setActive(true); 
    } 

    private void cleanupConversationContext() { 
     ConversationContext conversationContext = Container.instance().deploymentServices().get(ContextLifecycle.class).getConversationContext(); 
     conversationContext.setBeanStore(null); 
     conversationContext.setActive(false); 
    } 

} 
+0

Le problème est que d'abord, vous dépendez de l'implémentation Weld de CDI (et n'utilisez pas nécessairement votre implémentation d'Application Server), et deuxièmement, 'Container.instance(). DeploymentServices' est' private'. –

0

Quel est l'équivalent de ConversationContext proposé dans la réponse précédente Java EE si nous n'utilisons pas Weld?

Questions connexes