EJB方法被多次调用

时间:2019-12-20 16:36:07

标签: jpa ejb payara

我正在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次。而显然我只希望收到一条日志消息。

1 个答案:

答案 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());
}