在Conversation Scoped Bean中构建一个列表

时间:2017-01-12 21:56:00

标签: java java-ee primefaces cdi

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

我现在无法在平板电脑上发布代码,但我会在稍后提供基本说明和上传代码。

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

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

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

本质上,该列表包含第N个条目的N个副本

我考虑过将每个条目保存到数据库中并从中填充List,但这似乎是不合逻辑的。

过去两天这让我很难过。任何人都可以建议一些解决这个问题。我希望尽可能使用CDI bean而不是JSF Managed。

由于

1 个答案:

答案 0 :(得分:0)

由于这里没有代码,我将不得不采取一些猜测,但我认为问题是你的@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会话生效(或除非超时/无效)。