4

我需要将一个ConversationScopedbean注入一个servlet。我使用标准的简单@Inject标记,并使用 cid 参数调用 servlet,但是当它调用注入 bean 中的任何方法时,我收到以下错误:

org.jboss.weld.context.ContextNotActiveException:WELD-001303范围类型没有活动上下文javax.enterprise.context.ConversationScoped

我可以在 servlet 中注入这些 bean,还是只能注入 Session 和 Request 范围的 bean?

4

2 回答 2

1

在 servlet 中,上下文是应用程序上下文,这就是您放松对话范围的原因。这是一个小型实用程序类,如果您希望 servlet 中的对话范围支持,您可以将其用作匿名类并包装请求...

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

}
于 2011-05-13T21:32:41.917 回答
0

如果我们不使用 Weld,那么在 Java EE 的上一个答案中提出的 ConversationContext 等价物是什么?

于 2014-06-10T15:23:15.450 回答