JSF 托管的 bean getter 绝对不应该调用服务。他们应该只返回托管 bean 属性。这个属性应该已经由(post)构造函数或(action)listener 方法准备好了。这些方法将被调用一次。当 JSF 需要访问该值时,将多次调用 Getter。
您需要重写您的代码,以便第一次工作在托管 bean 的(后)构造函数中完成,并且<a4j:poll>
调用一个刷新列表的侦听器方法,并且 getter 除了返回属性之外什么都不做.
这是一个使用标准 Java EE 6 工件的基本启动示例。我不做 Spring,但你应该能够用 Spring 工件取代它。
@ManagedBean
@SessionScoped
public class Bean {
private List<Entity> entities;
@EJB
private EntityService service;
@PostConstruct
public void load() {
entities = service.list();
}
public List<Entity> getEntities() {
return entities;
}
}
和
<a4j:poll action="#{bean.load}" interval="60000" render="someTableId" />
也可以看看:
与具体问题无关:如果您有一个相当大的 DB 表(>1000 行),那么将整个 DB 表复制到 Java 的内存中是一个非常糟糕的主意。实现分页/过滤。