2011-01-28 6 views
4

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

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

Может ли я вводить эти бобы в сервлетах или я могу вводить только сеанс и запрос?

+0

Похоже, что нет разговора в тот момент, когда вы пытаетесь использовать ваш @ConversationScoped bean. Используете ли вы его в методе doGet/doPost? Если это так, то должен быть разговор, созданный автоматически для запроса или начинающийся вами «вручную», если вы это сделаете. – amorfis

ответ

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

} 
+0

Проблема в том, что во-первых, вы зависите от реализации Weld CDI (и не обязательно используете реализацию Application Server), а во-вторых, 'Container.instance(). DeployServices' является' private'. –

0

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