Как добавить бобы ConversationScoped в сервлет - PullRequest
4 голосов
/ 28 января 2011

Мне нужно добавить боб ConversationScoped в сервлет. я использую стандартный простой тег @Inject и вызываю сервлет с параметром cid, но когда он вызывает какой-либо метод во введенном бине, я получаю следующую ошибку:

org.jboss.weld.context.ContextNotActiveException: WELD-001303 Нет активных контекстов для типа области действия javax.enterprise.context.ConversationScoped

Могу ли я внедрить эти bean-компоненты в сервлеты или я могу добавить только bean-объекты Session and Request?

Ответы [ 2 ]

1 голос
/ 14 мая 2011

В сервлете контекст - это контекст приложения, поэтому вы теряете область диалога. Вот небольшой вспомогательный класс, который вы можете использовать как анонимный класс и обернуть запрос, если вы хотите поддерживать область диалога в сервлетах ...

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 голосов
/ 10 июня 2014

Что является эквивалентом ConversationContext, предложенного в предыдущем ответе в Java EE, если мы не используем Weld?

...