如何结束一个CDI会话并彻底销毁CDI Bean的所有变量?

时间:2014-05-07 06:58:22

标签: java-ee cdi weld conversation-scope

我使用JSF2.0和WELD-CDI以及jboss AS7.I在page-backbean中使用CDI @ ConversiationScope。 要转到一页,我正在使用菜单项。如图所示:

<rich:menuItem 
     label="redirect  to page1"
     execute="@this"
     action="#{myBean.begin}"/>

在此菜单的操作中,调用以下方法开始对话,然后重定向到所需的页面:

@Named(value = "myBean")
@ConversationScoped
public class MyBean implements Serializable {
@Inject
private Conversation conversation;

public String begin() {
    if (!conversation.isTransient()) {
        conversation.end();
    }
    conversation.setTimeout(“1800000”);
    conversation.begin();    
    return "page1";
}
}

faces-config.xml

<navigation-case>
        <from-outcome>page1</from-outcome>
        <to-view-id>/sample/page1.xhtml</to-view-id>
        <redirect/>
</navigation-case>

到目前为止,一切都很好。

但是,如果我再次申请,在执行conversation.end()之后,仍然没有变更变量和变量的所有值都维持。为什么呢?!

在exexute&#34; conversation.end()&#34;之后,变量 - 值未重置。为什么变量未重置?请帮帮我。

1 个答案:

答案 0 :(得分:0)

当您结束对话时,它变为瞬态。这意味着在结束请求后,它的内容将被销毁。但是,这意味着只要您仍在同一个请求中,调用end()就不会更改bean。 另一种说法是end()的效果被延迟;它只适用于下一个请求。 顺便说一下:字段重置并不是真的;将注入新的bean,这些新的bean当然会为其字段提供初始值。