我在理解 Weld 或 CDI 的对话范围时遇到一些问题。
在我的 JSF Faclets 页面中,我调用:
<f:metadata>
<f:event type="preRenderView" listener="#{viewBean.start}" />
</f:metadata>
豆子:
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() 来完成的 - 正如您已经所做的那样。如果您想在多个请求中使用同一个对话,则必须传播它——这就是你not正在做 :-)
当您传播对话时,对话 ID 会附加到请求中。这告诉容器需要哪个对话。当您点击刷新按钮而请求中没有对话 ID 时,将为每个请求生成一个新对话。
从文档中:
自动对话上下文
随任何 JSF faces 请求一起传播
(JSF 表单提交)或重定向。它
不会自动传播
非面孔请求,例如,
通过链接进行导航。
如果您需要手动传播它,只需将对话 ID 添加到请求中即可:
<h:link outcome="/addProduct.xhtml" value="Add Product">
<f:param name="cid" value="#{javax.enterprise.context.conversation.id}"/>
</h:link>
所有这些以及更多的内容都得到了解释here.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)