@PostConstruct为@ConversationScoped bean多次调用

Sim*_*mon 3 java cdi seam-conversation java-ee-6 jboss-weld

我有一个@ConversationScoped bean,带有一个start方法,如下所示:

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

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

我真正想要发生的是让sam对话流连,直到我手动调用conversation.end().我在这里错过了什么?

jan*_*oth 5

稍微偏离主题,但希望有价值:

我不是100%确定@PostConstruct是开始对话的合适场所.我宁愿使用像这样的面部事件:

<f:metadata>
        <f:event type="javax.faces.event.PreRenderViewEvent"
                listener="#{myBean.init}" />
</f:metadata>
Run Code Online (Sandbox Code Playgroud)

如果您确定不在JSF回发请求中,请启动对话.

public void init() {
       if (!FacesContext.getCurrentInstance().isPostback() && conversation.isTransient()) {
          conversation.begin();
       }
    }
Run Code Online (Sandbox Code Playgroud)

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

<f:metadata>
   <s:viewAction action="#{myBean.init}" if="#{conversation.transient}" />
</f:metadata>
Run Code Online (Sandbox Code Playgroud)


Arj*_*jms 4

您是否检查过 (AJAX) 调用是否包含对话 ID 参数 (cid)?

如果缺少该功能,则每次通话都会开始新的对话。