gpt4 book ai didi

重新显示同一页面时 JSF 2 : ViewScoped Problem, bean 未持久化

转载 作者:行者123 更新时间:2023-12-03 18:51:53 25 4
gpt4 key购买 nike

我知道为什么,但是当重新显示同一页面时,我的 viewscoped-bean 没有被持久化。我想知道这是否是因为使用了 facelet 模板?

这是我为帮助我解决问题所做的工作:

  • 添加@PostConstruct 方法并从那里进行调试
  • 在 setter 和 getter 方法中添加一些调试
  • ViewScoped 调试似乎有很多 PostConstruct 方法调用
  • 是的,状态不是持久化的(提交,将标志设置为 true,但是当重新显示标志时再次返回 false)
  • 尝试将范围更改为 session ,在重新启动我的 glassfish 时收到一条错误消息,提示“org.glassfish.deployment.common.DeploymentException:WELD-000072 托管 bean 声明钝化范围必须能够钝化”。必须使我的 bean 可序列化才能跳过此错误。
  • 而在 session 作用域 bean 中,PostConstruct 只被调用一次,并且状态持久化

  • 我想知道我的 ViewScope 案例出了什么问题?

    这是我的 facelet 文件:


    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <h:head>
    <title>#{msgs.title}</title>
    <h:outputStylesheet library="css" name="main.css" />
    </h:head>
    <h:body>
    <ui:composition template="/template/masterlayout.xhtml">
    <ui:define name="windowTitle">Checkbox Lab</ui:define>
    <ui:define name="heading">Checkbox Lab</ui:define>
    <ui:define name="content">
    <h:form>
    <p:messages id="messages" globalOnly="true"/>
    <h:panelGrid columns="3" styleClass="bordered">
    <h:outputLabel for="Married" value="Married" />
    <h:selectBooleanCheckbox label="Married" id="Married"
    value="#{checkboxLabBean.married}" />
    <p:message for="Married"/>

    <p:panel header="debug info" id="debugPanel"
    toggleable="true" toggleSpeed="300" >
    <h:panelGrid columns="2">
    <h:outputText value="rendered :"/>
    #{checkboxLabBean.submitted}

    <h:outputText value="married status :"/>
    #{checkboxLabBean.married}
    </h:panelGrid>
    </p:panel>
    </h:panelGrid>
    <h:commandButton value="Refresh"
    action="#{checkboxLabBean.submit}"/>
    </h:form>
    </ui:define>
    </ui:composition>
    </h:body>
    </html>

    这是我的 bean :
    package user.ui;

    import java.io.Serializable;

    import javax.annotation.PostConstruct;
    import javax.faces.bean.ViewScoped;
    import javax.inject.Named;

    @Named
    @ViewScoped
    public class CheckboxLabBean implements Serializable {
    private boolean married = true;
    private boolean submitted;

    @PostConstruct
    public void debugPostConstruct() {
    System.out.println("Post Construct !");
    }

    public boolean isMarried() {
    return married;
    }
    public void setMarried(boolean married) {
    this.married = married;
    }
    public boolean isSubmitted() {
    System.out.println("returning submit : " + this.submitted);
    return submitted;
    }
    public void setSubmitted(boolean submitted) {
    this.submitted = submitted;
    }

    public String submit() {
    System.out.println("setting submit to true");
    this.submitted = true;
    return null;
    }
    }

    这是我的 viewscope 和 sessionscope 日志的输出:

    View 范围重新启动网络应用程序后首次打开:

    [#|2010-12-24T11:01:11.307+0700|INFO|glassfish3.0.1|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=34;_ThreadName=Thread-1;|Post Construct !|#]

    [#|2010-12-24T11:01:11.310+0700|INFO|glassfish3.0.1|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=34;_ThreadName=Thread-1;|Post Construct !|#]

    [#|2010-12-24T11:01:11.310+0700|INFO|glassfish3.0.1|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=34;_ThreadName=Thread-1;|returning submit : false|#]

    [#|2010-12-24T11:01:11.311+0700|INFO|glassfish3.0.1|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=34;_ThreadName=Thread-1;|Post Construct !|#]

    [#|2010-12-24T11:01:11.322+0700|INFO|glassfish3.0.1|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=34;_ThreadName=Thread-1;|Post Construct !|#]

    [#|2010-12-24T11:01:11.322+0700|INFO|glassfish3.0.1|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=34;_ThreadName=Thread-1;|Post Construct !|#]



    View 范围点击刷新按钮后

    [#|2010-12-24T11:02:46.129+0700|INFO|glassfish3.0.1|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=37;_ThreadName=Thread-1;|Post Construct !|#]

    [#|2010-12-24T11:02:46.130+0700|INFO|glassfish3.0.1|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=37;_ThreadName=Thread-1;|Post Construct !|#]

    [#|2010-12-24T11:02:46.131+0700|INFO|glassfish3.0.1|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=37;_ThreadName=Thread-1;|Post Construct !|#]

    [#|2010-12-24T11:02:46.131+0700|INFO|glassfish3.0.1|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=37;_ThreadName=Thread-1;|Post Construct !|#]

    [#|2010-12-24T11:02:46.131+0700|INFO|glassfish3.0.1|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=37;_ThreadName=Thread-1;|setting submit to true|#]

    [#|2010-12-24T11:02:46.133+0700|INFO|glassfish3.0.1|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=37;_ThreadName=Thread-1;|Post Construct !|#]

    [#|2010-12-24T11:02:46.134+0700|INFO|glassfish3.0.1|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=37;_ThreadName=Thread-1;|Post Construct !|#]

    [#|2010-12-24T11:02:46.134+0700|INFO|glassfish3.0.1|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=37;_ThreadName=Thread-1;|returning submit : false|#]

    [#|2010-12-24T11:02:46.134+0700|INFO|glassfish3.0.1|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=37;_ThreadName=Thread-1;|Post Construct !|#]

    [#|2010-12-24T11:02:46.136+0700|INFO|glassfish3.0.1|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=37;_ThreadName=Thread-1;|Post Construct !|#]

    [#|2010-12-24T11:02:46.136+0700|INFO|glassfish3.0.1|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=37;_ThreadName=Thread-1;|Post Construct !|#]



    session 范围重新启动网络应用程序后首次打开:

    [#|2010-12-24T10:58:54.610+0700|INFO|glassfish3.0.1|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=32;_ThreadName=Thread-1;|Post Construct !|#]

    [#|2010-12-24T10:58:54.612+0700|INFO|glassfish3.0.1|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=32;_ThreadName=Thread-1;|returning submit : false|#]



    session 范围点击刷新按钮后:

    [#|2010-12-24T10:59:14.613+0700|INFO|glassfish3.0.1|org.hibernate.validator.engine.resolver.DefaultTraversableResolver|_ThreadID=37;_ThreadName=Thread-1;|Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.|#]

    [#|2010-12-24T10:59:14.615+0700|INFO|glassfish3.0.1|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=37;_ThreadName=Thread-1;|setting submit to true|#]

    [#|2010-12-24T10:59:14.617+0700|INFO|glassfish3.0.1|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=37;_ThreadName=Thread-1;|returning submit : true|#]

    最佳答案

    问题似乎是您将 bean 声明为 CDI 托管 bean,不是 JSF 托管 bean 。 @ViewScoped 是 CDI 本身不支持的 JSF 特定范围。

    CDI 确实允许您创建自定义范围,因此您可以为其构建支持。事实上,这已经完成了。看到这个:http://seamframework.org/Community/JSF2ViewScopeInCDI

    在不使用任何扩展的情况下,以下代码运行良好:

    import javax.annotation.PostConstruct;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.ViewScoped;

    @ManagedBean
    @ViewScoped
    public class MyBean {

    String state = "";

    @PostConstruct
    public void test() {
    System.out.println("pc called");
    state = "state set";
    }

    public String getState() {
    return state;
    }

    public String action() {
    return "";
    }
    }

    以及以下 Facelet:
    <html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">
    <h:body>

    #{myBean.state}

    <h:form>
    <h:commandButton value="test" action="#{myBean.action}"/>
    </h:form>
    </h:body>
    </html>

    post构造方法现在只会被调用一次,按下命令按钮后页面将刷新但状态将保留。

    关于重新显示同一页面时 JSF 2 : ViewScoped Problem, bean 未持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4524280/

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