我有一个会话范围的bean来存储所选的员工。 始终可见的输入可以随时更改所选员工。
因为有大量可调整的设置(和视图),一些会话范围的bean将其@PostConstruct加载的数据保存在成员变量中,并且我不想在打开视图时从存储中重新加载此数据( @ViewScoped)。
我不知道如何通知所有活动的bean有关新选择的员工。
欢迎提示......;)
我使用Tomcat 8,Primefaces 5,JSF 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;
}
}