EJB方法被多次调用

问题描述 投票:0回答:1

我正在Payara 5服务器上开发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次。显然,我希望只有一条日志消息。

jpa ejb payara
1个回答
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());
}
© www.soinside.com 2019 - 2024. All rights reserved.