给出以下简单的测试用例
<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;
。