java - @PostConstruct 多次调用@ConversationScoped bean

标签 java java-ee-6 cdi jboss-weld seam-conversation

我有一个@ConversationScoped bean,有一个启动方法,像这样:

@PostConstruct
public void start() {
    if (conversation.isTransient()) {
        conversation.begin();
        log.debug("conversation.getId(): " + conversation.getId());
    }
}

我的问题是每次刷新页面都会启动一个新对话,每次我对 bean 中的方法进行 AJAX 调用时也会启动一个新对话(这是我的主要问题)。

我真正想要发生的是让 sam 对话一直存在,直到我手动调用 conversation.end()。我在这里缺少什么?

最佳答案

有点偏离主题,但希望有值(value):

我不是 100% 确定@PostConstruct 是开始对话的正确位置。我宁愿使用这样的面孔事件:

<f:metadata>
        <f:event type="javax.faces.event.PreRenderViewEvent"
                listener="#{myBean.init}" />
</f:metadata>

如果您确定自己不在 JSF 回发请求中,则开始对话。

public void init() {
       if (!FacesContext.getCurrentInstance().isPostback() && conversation.isTransient()) {
          conversation.begin();
       }
    }

如果你使用 Seam 3,它会更容易:

<f:metadata>
   <s:viewAction action="#{myBean.init}" if="#{conversation.transient}" />
</f:metadata>

关于java - @PostConstruct 多次调用@ConversationScoped bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6161618/

相关文章:

java - 如何从 eclipse url 中删除项目名称?

java - GridBagLayout 中的图像大小不正确

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

jakarta-ee - 在 Java EE 企业应用程序中将业务逻辑放在哪里

java - JAX-RS:Stateless、Singleton、RequestScoped 混淆

java - 外部方法调用帮助

java - 替换最后一个正斜杠之后的所有内容

security - session 固定 - 登录后删除 session 并创建新 session - 但用户不再登录

java - 如何使用 AS6 在 JMX 中使用 CDI 获取 'JBoss service'?

java - 在 EJB 3.1 中控制 CDI 启动