java - Jsf 属性未保存

标签 java jsf lifecycle

我真的不明白为什么这个简单的东西不起作用。我可以看到我设置了每次设置一个属性时都会调用构造函数。问题是,当我到达 sendInvitation 方法时,所有邀请电子邮件都为空。

@Named(value = "adminBean")
@RequestScoped
public class AdminBean implements Serializable {

    private String inviteEmail1;
    private String inviteEmail2;
    private String inviteEmail3;
    private BasicUser administrator;
    @EJB
    private MessageBeanRemote messageBean3;

    /** Creates a new instance of AdminBean */
    public AdminBean() {
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().
                getExternalContext().getSession(true);
        LoginBean loginBean = (LoginBean) session.getAttribute("loginBean");
        administrator = loginBean.getUser();
    }

    public String getInviteEmail1() {
        return inviteEmail1;
    }

    public void setInviteEmail1(String inviteEmail) {
        this.inviteEmail1 = inviteEmail;
    }

    public String getInviteEmail2() {
        return inviteEmail2;
    }

    public void setInviteEmail2(String inviteEmail) {
        this.inviteEmail2 = inviteEmail;
    }

    public String getInviteEmail3() {
        return inviteEmail3;
    }

    public void setInviteEmail3(String inviteEmail) {
        this.inviteEmail3 = inviteEmail;
    }

    public void sendInvitations() { 
    ...
    }
}

使用此 bean 的页面是一个组件,它是另一个页面的一部分:

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets">
    <ui:component id="adminComp">
        <h3>Adminstration page</h3>
        <h:form id="inviteForm">
            <h:panelGrid columns="1">
                Invite new members to your group. Type in their emails in the fields below.
                <h:inputText id="email1" value="#{adminBean.inviteEmail1}" size="40"/>
                <h:inputText id="email2" value="#{adminBean.inviteEmail2}" size="40"/>
                <h:inputText id="email3" value="#{adminBean.inviteEmail3}" size="40"/>
                <h:commandButton value="invite" action="#{adminBean.sendInvitations}"/>
            </h:panelGrid>
        </h:form>
    </ui:component>


</html>

adminBean 实际上被初始化了很多次,看起来有点奇怪。 “Constructor”是adminBean构造函数,“Get 1”是getInviteEmail1等等。

INFO: START PHASE RESTORE_VIEW 1
INFO: END PHASE RESTORE_VIEW 1
INFO: START PHASE APPLY_REQUEST_VALUES 2
INFO: END PHASE APPLY_REQUEST_VALUES 2
INFO: START PHASE PROCESS_VALIDATIONS 3
INFO: Constructor
INFO: Constructor
INFO: Constructor
INFO: Constructor
INFO: Constructor
INFO: Constructor
INFO: Get 2
INFO: Constructor
INFO: Constructor
INFO: Constructor
INFO: Get 3
INFO: END PHASE PROCESS_VALIDATIONS 3
INFO: START PHASE UPDATE_MODEL_VALUES 4
INFO: Constructor
INFO: Set 1
INFO: Constructor
INFO: Set 2
INFO: Constructor
INFO: Set 3
INFO: END PHASE UPDATE_MODEL_VALUES 4
INFO: START PHASE INVOKE_APPLICATION 5
INFO: Constructor
SEVERE: NullPointerException....
INFO: END PHASE INVOKE_APPLICATION 5
INFO: START PHASE RENDER_RESPONSE 6
INFO: Constructor
INFO: Constructor
INFO: Get 2
INFO: Constructor
INFO: Get 3
INFO: END PHASE RENDER_RESPONSE 6

如有任何帮助,我们将不胜感激。

最佳答案

我不知道 @Named 东西在那里做什么,但是每次通过值表达式访问 bean 时都会构造 bean,这是不正常的。它应该只在 HTTP 请求开始时构造一次。可能 @Named 后面的配置是错误的。

尝试使用 @ManagedBean 以 JSF 方式声明 Bean,并确保 @RequestScoped 也来自 javax.faces.bean 包。

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

@ManagedBean
@RequestScoped
public class AdminBean implements Serializable {
    // ...
}
<小时/>

除了这个问题之外,不推荐您获取 session 作用域 bean 的方法。正常的 JSF 方式如下:

@ManagedProperty(value="#{loginBean}")
private LoginBean loginBean;

如果需要,可以使用以下 getter

public BasicUser getAdministrator() {
    return loginBean.getUser();
}

关于java - Jsf 属性未保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3950243/

相关文章:

java - 为什么 Instant 不支持 ChronoUnit.YEARS 的操作?

java - 通过 postValidate 进行 JSF 跨字段验证,无需在支持 bean 中按名称查找组件

c# - Unity - 如果我使用自己的 Start() 方法创建两个脚本,哪一个将首先调用?

jsf-2 - JSF 组件中的立即=真 VS 立即=假

javascript - 在 react 生命周期方法 : doc. addEventListener ('onmousemove' ,...不工作,但 doc.onmousemove = ... 是。为什么?

java - 无法在 Hystrix 仪表板上查看 Hystrix 报告

java - 安卓 SQlite : Insert data into multiple tables with sharing ids

当 session 在 websphere 中失效时,Spring View 范围不会被破坏

java - Glassfish 服务器未在 Eclipse 上启动

java - JPA 存储库属性表达式