jsf - CDI ConversationScoped 长时间运行的 Bean 不工作

标签 jsf java-ee-6 cdi jboss-weld

我在理解 Weld 或 CDI 的对话范围时遇到一些问题。

在我的 JSF Faclets 页面中,我调用:

        <f:metadata>
            <f:event type="preRenderView" listener="#{viewBean.start}" />
        </f:metadata>

bean :

import javax.enterprise.context.Conversation;
import javax.enterprise.context.ConversationScoped;
@Named
@ConversationScoped
public class ViewBean implements Serializable {

@Inject
    private Conversation conversation;

public void start() {
    if (conversation.isTransient()) {
        System.out.println("START CONVERSATION");
        conversation.begin();

    }
}

现在,每次我刷新浏览器时,都会开始一个新的对话。这是正确的行为吗?那么为什么谈话总是短暂的呢?没有抛出异常。 beans.xml 已创建并且为空:

<beans xmlns="http://java.sun.com/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>

最佳答案

简短回答:是的,这是正确的行为。

长答案:对话代表一个“工作单元”,必须对其进行明确划分。这是通过显式调用对话.begin() 来完成的 - 正如您已经所做的那样。如果您想在多个请求中使用同一个对话,则必须传播它 - 这是您做的事情:-)

当您传播对话时,对话 ID 会附加到请求中。这告诉容器需要哪个对话。当您点击刷新按钮而请求中没有对话 ID 时,将为每个请求生成一个新对话。

来自文档:

The conversation context automatically propagates with any JSF faces request (JSF form submission) or redirect. It does not automatically propagate with non-faces requests, for example, navigation via a link.

如果您需要手动传播它,只需将对话 ID 添加到请求中即可:

<h:link outcome="/addProduct.xhtml" value="Add Product">
   <f:param name="cid" value="#{javax.enterprise.context.conversation.id}"/>
</h:link>

所有这些以及更多内容都有解释 here .

关于jsf - CDI ConversationScoped 长时间运行的 Bean 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5250311/

相关文章:

java - JSF2.0 @EJB 注入(inject) @ViewScoped 导致 MyFaces 变为 CFNE

Java EE 6 框架

java - 有没有办法在没有 EAR 的情况下将 EJB 模块与 WAR 打包在一起?

jsf - 在 Wildfly 中禁用焊接会奇怪地降低 JSF 性能

java - 从单个 html 表单(jsf 页面)更新不同的 jpa 实体

java - 在 Java CDI 拦截器中获取调用者类

java - 包含的启用 CDI 的 Servlet 失败,出现 ContextNotActiveException : WELD-001303:

java - 如何将枚举作为泛型参数传递

javascript - JSF 在 onClick 事件之前执行 Ajax

jsf - p :dataExporter not exporting just the displayed page