4

ConversationScopedBean をサーブレットに注入する必要があります。標準の単純な@Injectタグを使用し、cid パラメーターを指定してサーブレットを呼び出しますが、注入された Bean でメソッドを呼び出すと、次のエラーが発生します。

org.jboss.weld.context.ContextNotActiveException:WELD-001303スコープ タイプのアクティブなコンテキストがありませんjavax.enterprise.context.ConversationScoped

これらの Bean をサーブレットに注入できますか、それとも、Session および Request スコープの Bean のみを注入できますか?

4

2 に答える 2

1

サーブレットでは、コンテキストはアプリケーション コンテキストであるため、会話スコープが失われます。これは、サーブレットで会話スコープのサポートが必要な場合に、匿名クラスとして使用してリクエストをラップできる小さなユーティリティ クラスです...

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 に答える