【问题标题】:Building a List within Conversation Scoped Bean在对话范围 Bean 中构建列表
【发布时间】:2017-01-12 21:55:59
【问题描述】:

我遇到了 Primefaces 5 和 JSF 2.1 的问题。

现在无法发布代码,因为我在平板电脑上,但我会给出基本描述并稍后上传代码。

我有一个ConversationScoped CDI bean 和一个带有 5 个文本字段的 JSF 页面,映射到一个实体、一个 primefaces 数据视图和一个按钮。我想要做的是继续将字段中的数据添加到 dataView 中。

我在 bean 类中有一个列表,例如 private List<dataEntity> data = new ArrayList<dataEntity>

我有一个方法是通过按下将数据添加到数组中的按钮来触发的,但是每次添加数据时,列表中的所有条目都会被最新的条目替换。

列表基本上包含第 N 个条目的 N 个副本

我想过将每个条目保存到数据库中并从中填充列表,但这似乎不合逻辑。

在过去的两天里,这让我很难过。任何人都可以提出一些解决这个问题的方法。如果可能的话,我想使用 CDI bean 而不是 JSF Managed。

谢谢

【问题讨论】:

  • 发布您的代码并澄清所有条目都被替换的意思
  • 你什么时候开始对话?您是否将其标记为长时间运行?每次按下按钮时,如果会话没有长时间运行,或者下一个请求中不存在 cid,则您的会话范围 bean 实际上是请求范围 bean

标签: java jakarta-ee primefaces cdi


【解决方案1】:

由于您这里没有代码,我将不得不进行一些猜测,但我认为问题在于您的 @ConversationScoped bean,或者更确切地说是对它的生命周期的理解。

除非您使对话长时间运行,否则此范围的行为将与 @RequestScoped 相同 - 它将在每次请求后被丢弃并在新请求后重新创建。这意味着其中的 List 将在每个请求中重新创建时间。

你想要的是让对话长时间运行,你通常通过以下方式进行:

@ConversationScoped
public class YourBean {

    @Inject Conversation conversation

    // call this sometime within the first request
    public void conversationStartingMethod() {
        conversation.begin();
    }

}

或者,您可以改为使用 bean @SessionScoped,这将使其在整个 HTTP 会话中都有效(或者除非超时/无效)。

【讨论】:

  • 对不起,没有代码,我正在使用自动取款机旅行,没有电脑访问权限。我的对话开始正常,但是当我将第一个项目添加到列表时,它运行正常,所以我得到一个 dataEntity 类型的条目,比如 e1,但是当我添加第二个条目,比如 e2 时,列表然后包含两个条目,但都是 e2 和等等等等。本质上,该列表包含第 N 个条目中的 N 个
  • 嗯,我明白你的意思了。我会等到你发布代码 - 这听起来更像是你的代码中的一些小错误(你将它存储到列表中的方式)而不是其他任何东西。
猜你喜欢
  • 1970-01-01
  • 2018-06-25
  • 2013-08-26
  • 2013-02-26
  • 2015-01-27
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 2011-09-02
相关资源
最近更新 更多