jsf-2 - 如何防止@PostConstruct 在回发时被调用

标签 jsf-2 postback postconstruct

当页面第一次加载时,@PostConstruct被调用,但是当我在此页面上执行回发时,@PostConstruct再次被调用。

我怎样才能让它只在初始请求上运行而不是在每次回发时运行?

@PostContruct
public void init() {
    // charge combos....
}

public void submit() { 
    // action 
}

最佳答案

显然,您的 bean 是请求范围的,因此在每个 HTTP 请求上都进行了重构。我不确定您为什么要阻止 @PostConstruct避免再次被调用,否则您最终会得到一个“空”bean 状态,这可能会导致表单提交错误,但是好的,如果当前请求不是 postback,您可以添加一个检查。 .

public void init() {
    if (!FacesContext.getCurrentInstance().isPostback()) {
        // charge combos....
    }
}
这样,在回发时不会调用“充电组合”部分。
或者,也许您的实际问题不是“如何防止在回发时调用 postconstruct?”,而是“如何在回发时保留相同的 bean 实例?”。在这种情况下,您需要将 bean 放在 View 范围而不是请求范围中。
@ManagedBean
@ViewScoped
public class Bean implements Serializable {
    // ...
}
只要你回null从操作方法来看,这样只要您通过回发与相同的 View 交互,相同的 bean 实例就会存在。这样@PostConstruct不会被调用(只是因为 bean 没有被重建)。
也可以看看:
  • How to choose the right bean scope?
  • 关于jsf-2 - 如何防止@PostConstruct 在回发时被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13252450/

    相关文章:

    asp.net - 跨多个回发存储对象的方法

    spring - 如何确保 "pool"bean 获得它需要的所有其他 bean?

    Spring AOP 和后构造

    JSF @managedproperty 和 @PostConstruct

    jsf - action 和 actionListener 的区别

    jsf - 是否有可能有 h :commandLink (or similar) to navigate to an URI with a fragment?

    c# - 在回发时维护滚动位置和选定控件

    java - 使用自定义 ViewHandler 处理登录页面上的 ViewExpiredException

    jsf-2 - 在 JBoss AS7 堆栈(JSF2、CDI、JPA2、Seam?)上拥有 ViewScope 和避免 LazyInitializationException 的最简单方法

    c# - Javascript 和回发问题