gpt4 book ai didi

jsf - @ViewScoped在每个回发请求上调用@PostConstruct

转载 作者:行者123 更新时间:2023-12-02 19:39:45 27 4
gpt4 key购买 nike

这似乎不正确。我正在清理代码,只是注意到了这一点。每个ajax请求都会触发我的@PostConstruct bean的构造函数和@ViewScoped。即使是简单的数据库分页也会触发它。

understood表示@ViewScoped@RequestScoped长,因此不应在每次请求时都对其进行重构。仅在通过GET重新加载完整页面之后。

最佳答案

换句话说,您的@ViewScoped bean的行为类似于@RequestScoped bean。它已在每个回发请求中从头开始重新创建。造成这种情况的原因有很多,其中大多数原因归结为,在JSF状态下关联的JSF View 不再可用,而在默认情况下,该状态又与HTTP session 相关联。
前提是您可以确保HTTP session 本身不是问题的根本原因,即@SessionScoped正常运行时,然后遍历以下可能的原因列表。否则,如果HTTP session 本身也被删除并在每个单个请求上重新创建,那么您需要退后一步,查看 session cookie和服务器配置。与HTTP session 中断有关的任何原因至少都超出了JSF的范围。

  • 您正在使用Mojarra 2.1.17或更早的版本,并且该 View 包含EL表达式,这些EL表达式将 View 作用域的bean属性绑定(bind)到在view build time期间评估的tag属性。例如JSTL <c:if><c:forEach>等或JSF <ui:include><x:someComponent id="#{...}"<x:someComponent binding="#{...}">等。这是由Mojarra(issue 1496)中的错误引起的。另请参阅Why does @PostConstruct callback fire every time even though bean is @ViewScoped? JSF
    Mojarra 2.1.18版中已修复此问题。如果您不能升级到较新的版本,解决方法是禁用部分状态保存,如下所示:web.xml,另请参见JSTL in JSF2 Facelets... makes sense?
     <context-param>
    <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
    <param-value>false</param-value>
    </context-param>
    或者,当您只想定位一组特定的JSF View 时:
     <context-param>
    <param-name>javax.faces.FULL_STATE_SAVING_VIEW_IDS</param-name>
    <param-value>/foo.xhtml;/bar.xhtml;/folder/baz.xhtml</param-value>
    </context-param>
    值得一提的是,将JSF组件的idbinding属性的值绑定(bind)到 View 作用域的bean属性是一种不好的做法。那些应该确实绑定(bind)到请求范围的bean属性,或者应该寻求替代方法。另请参阅How does the 'binding' attribute work in JSF? When and how should it be used?
  • 您使用的是Mojarra 2.2.0,只有该版本在维护 View 范围方面存在一个(至今未知)错误,该错误已在2.2.1中修复,另请参见issue 2916。解决方案是升级到新版本。
  • @ViewScoped批注是从错误的软件包中导入的。 JSF提供了两种@ViewScoped批注,一种来自javax.faces.bean包,用于由@ManagedBean注释的JSF托管bean,另一种来自javax.faces.view包,用于以@Named注释的CDI托管bean。当bean作用域注释与bean管理注释不匹配时,实际的bean作用域将成为bean管理框架的默认作用域,在JSF受管bean中为@RequestScoped,在CDI受管bean中为@Dependent
    您需要确保具有以下任何一种构造,并且不要混合使用,另请参见@ViewScoped bean recreated on every postback request when using JSF 2.2
     import javax.faces.bean.ManagedBean;
    import javax.faces.bean.ViewScoped;

    @ManagedBean
    @ViewScoped
    public class CorrectJSFViewScopedBean implements Serializable {
     import javax.inject.Named;
    import javax.faces.view.ViewScoped;

    @Named
    @ViewScoped
    public class CorrectCDIViewScopedBean implements Serializable {
  • 该 View (偶然地?)通过<f:view transient="true">标记为 transient 。这基本上打开了“无状态JSF”,这是自Mojarra 2.1.19之后的新功能。因此,根本不会将JSF View 完全保存为JSF状态,并且逻辑上的结果是,所有引用的 View 范围的Bean都无法再与JSF View 关联。另请参阅What is the usefulness of statelessness in JSF?
  • Web应用程序配置了com.sun.faces.enableRestoreView11Compatibility上下文参数,将其设置为true,这是对“避免” ViewExpiredException的错误尝试。有了此上下文参数,就永远不会抛出ViewExpiredException,而只是从头开始重新创建 View (以及所有与 View 关联的所有范围内的bean)。但是,如果在每个请求上都发生这种情况,则此方法实际上隐藏了另一个问题: View 过早过期。这表明在维护JSF View 状态和/或HTTP session 时可能存在问题。如何正确解决/配置该问题,请转到javax.faces.application.ViewExpiredException: View could not be restored
  • Web应用程序的运行时类路径被多个不同版本的JSF API或与impl相关的类所污染。这会导致JSF View 状态的标识符/标记损坏/不匹配。您需要确保在webapp的/WEB-INF/lib中没有多个JSF API JAR文件。如果您使用的是Maven,请确保将服务器提供的库标记为<scope>provided</scope>。另请参见our JSF wiki page中的“安装JSF”部分以及此相关问题的答案:How to properly install and configure JSF libraries via Maven?
  • 当您使用PrimeFaces <p:dialog>时,请确保<p:dialog>具有自己的<h:form>,并且不嵌套在另一个<h:form>中。另请参见p:fileUpload inside p:dialog losing @ViewScoped values
  • 当您将PrimeFaces FileUploadFilter与PrettyFaces结合使用时,请确保FileUploadFilter也可以在PrettyFaces重写/转发的请求上运行。另请参见ViewScoped bean rebuilt when FileUploadListener called using PrettyFacesHow to use PrimeFaces p:fileUpload? Listener method is never invoked or UploadedFile is null / throws an error / not usable
  • 当您使用PrettyFaces时,配置错误的重写规则会将CSS / JS /图像资源重定向到与@ViewScoped bean绑定(bind)的JSF页面,这也会产生误导性的行为。另请参见CDI ViewScope & PrettyFaces: Multiple calls to @PostConstruct (JSF 2.2)
  • 关于jsf - @ViewScoped在每个回发请求上调用@PostConstruct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5541813/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com