JSF中的@PostConstruct方法在每次AJAX调用时都会被调用,即使托管bean被赋予了一个视图作用域



给出以下简单的测试用例

<h:form id="form" prependId="true">
    <p:commandButton value="Submit" actionListener="#{testManagedBean.action}"/>
    <p:commandLink value="Submit" actionListener="#{testManagedBean.action}"/>
</h:form>

涉及的JSF管理bean:

@ManagedBean
@ViewScoped
public final class TestManagedBean implements Serializable
{
    private static final long serialVersionUID = 1L;
    @PostConstruct
    private void init() {
        System.out.println("init() called");
        // May invoke expensive business services like EJB calls.
    }
    public void action() {
        System.out.println("action() called.");
    }
}

当给定的<p:commandButton><p:commandLink>被按下时,除动作监听器action()外,还会调用init()方法。

不应该发生这种情况,因为init()方法可能具有昂贵的业务服务,不应该在每个AJAX请求上不必要地调用这些服务。

是否有办法防止这种行为?在AJAX调用中不应该调用init()方法。

我使用JSF 2.2.6和PrimeFaces 5.0 final

如果托管bean不是CDI工件,则使用import javax.faces.bean.ViewScoped;

最新更新