В сервлет контексте контекст приложения, поэтому вы освобождаете область разговора. Вот небольшая утилита класс, который вы можете использовать в качестве анонимного класса и обернуть запрос с, если вы хотите поддержку области видимости разговора в сервлетах ...
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);
}
}
Похоже, что нет разговора в тот момент, когда вы пытаетесь использовать ваш @ConversationScoped bean. Используете ли вы его в методе doGet/doPost? Если это так, то должен быть разговор, созданный автоматически для запроса или начинающийся вами «вручную», если вы это сделаете. – amorfis