我正在Payara 5 Server上开发JEE8应用程序。我在一个无状态EJB中有一个方法,该方法仅被调用一次(从JSF页面),但是在服务器端它被调用多次。我已经在Payara5.192,Payara 5.193和Glassfish 5上尝试过该方法。但是我一直遇到同样的问题。下面的代码-
@Override
public List<Forum> getForums(int startIndex, int size) {
TypedQuery<Forum> tQ=em.createQuery("select f from Forum f", Forum.class);
tQ.setFirstResult(startIndex);
tQ.setMaxResults(size);
List<Forum> toReturn=tQ.getResultList();
LOGGER.info("Forums extracted "+toReturn.size());
return toReturn;
}
如果我从索引0开始分页并且结果大小为5,则LOGGER.info会生成以下日志,看起来很荒谬!
Info: Forums extracted 5
Info: Forums extracted 5
Info: Forums extracted 5
Info: Forums extracted 5
Info: Forums extracted 5
Info: Forums extracted 5
此外,该循环进行的次数也不固定。它可以执行15-30次。而显然我只希望收到一条日志消息。
答案 0 :(得分:0)
如果将#{managedBean.forums}用作JSF组件的值,则可能会多次调用该方法,因为该组件每次需要访问数据时都会调用getter。
在JSF中执行此操作的方法是实现一个方法,该方法加载数据并从@PostConstruct方法中调用它,并且每次需要重新加载数据时都如此。 JSF组件的value属性中使用的方法应该是仅返回数据的简单getter:
private List<Forum> forums;
public List<Forum> getForums() {
return forums;
}
@PostConstruct
private void init() {
loadForums();
}
public void loadForums() {
TypedQuery<Forum> tQ=em.createQuery("select f from Forum f", Forum.class);
tQ.setFirstResult(startIndex);
tQ.setMaxResults(size);
forums =tQ.getResultList();
LOGGER.info("Forums extracted "+forums.size());
}