如何全局通知sessionscoped bean重新加载他们的数据?

时间:2015-07-14 12:51:12

标签: jsf jsf-2

我有一个会话范围的bean来存储所选的员工。 始终可见的输入可以随时更改所选员工。

因为有大量可调整的设置(和视图),一些会话范围的bean将其@PostConstruct加载的数据保存在成员变量中,并且我不想在打开视图时从存储中重新加载此数据( @ViewScoped)。

我不知道如何通知所有活动的bean有关新选择的员工。

欢迎提示......;)

我使用Tomcat 8,Primefaces 5,JSF 2.2。

2 个答案:

答案 0 :(得分:0)

由于您不希望每次加载页面时都重新加载此数据,因此您至少可以搜索所选员工,如果相同,则执行更新。如果没有,你不需要做任何事情。

答案 1 :(得分:0)

请注意:对于糟糕的设计,此解决方案是解决方法

设计不足是将数据缓存在会话范围的支持bean中,而不是在后端使用第二级JPA缓存(请参阅评论BalusC)。

解决方法:
我的会话作用域SessionManager保留selectedPerson。在更改此选择时,时间戳会更新:

@Named
@SessionScoped
public class SessionManager implements Serializable {

  private Date lastUpdateSelectedPerson;  // +getter

  public void setSelectedPerson(Person selectedPerson) {
    this.selectedPerson = selectedPerson;
    lastUpdateSelectedPerson = new Date();
  }
}

因此,其他支持bean可以将此时间戳与本地更新时间戳进行比较:

@Named
@SessionScoped
public class MyData implements Serializable {

  @Inject SessionManager sessionManager;
  private Date lastUpdateData;

  private void updateData() {
    // update data
    lastUpdateData = sessionManager.getLastUpdateSelectedPerson();
  }

  public List<Data> getData() {
    if (sessionManager.getLastUpdateSelectedPerson().compareTo(lastUpdateData) > 0)
            updateData;
        return data;
    }
}