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