【问题标题】:How END one CDI conversation and completely destroy all variable of CDI Bean?如何结束一个 CDI 会话并彻底销毁 CDI Bean 的所有变量?
【发布时间】:2014-06-24 00:29:39
【问题描述】:

我使用 JSF2.0 和 WELD-CDI 和 jboss AS7。我在 page-backbean 中使用 CDI@ConversiationScope。 去单页,我用的是menu-item,如图:

<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()之后,仍然没有改变变量并且变量的所有值都保持。为什么?!

执行 "conversation.end()" 后,变量值未重置。为什么变量未重置?请帮帮我。

【问题讨论】:

  • 我相信它的工作方式是结束你的谈话并开始一个新的谈话。您在代码中的哪个位置开始一个新的?
  • 我有几个页面,要转到任何特定页面,我使用 menuItem。调用菜单“backBean.begin()”的操作。

标签: jakarta-ee cdi weld conversation-scope


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-09-24
    • 1970-01-01
    • 2017-03-07
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 2012-05-11
    • 1970-01-01
    相关资源
    最近更新 更多