JSF生命周期阶段顺序

时间:2015-04-28 10:49:38

标签: jsf jsf-2.2

我已经制作了一个小型的jsf应用程序,对生命周期顺序感到有点困惑,即使我在每个请求上都创建了该对象,我也会在回发时遇到意外的NPE。有人可以解释一下在幕后发生的事情。这是代码:

Entity.java

public class Entity {

    private Long id;
    private String property;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getProperty() {
        return property;
    }

    public void setProperty(String property) {
        this.property = property;
    }
}

Bean.java

import javax.enterprise.inject.Model;

@Model
public class Bean {

    private Long id;
    private Entity entity;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Entity getEntity() {
        return entity;
    }

    public void loadEntity() {
        this.entity = new Entity();
    }
}

edit.xhtml

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:o="http://omnifaces.org/ui">
    <f:view transient="true">
        <f:metadata>
            <f:viewParam name="id" value="#{bean.id}"/>
            <f:viewAction onPostback="true" action="#{bean.loadEntity()}"/>
        </f:metadata>
        <h:body>
            <o:form useRequestURI="true">
                <h:inputText value="#{bean.entity.property}"/>
                <h:commandButton value="Save"/>
            </o:form>
        </h:body>
    </f:view>
</html>

1 个答案:

答案 0 :(得分:2)

在调用应用程序阶段调用<f:viewAction action>之类的操作方法。在更新模型值阶段期间更新模型值。因此,当需要设置属性时,实体创建一个阶段太晚了,仍然是null

取消<f:viewAction>并改为使用@PostConstruct方法。

@PostConstruct
public void init() {
    this.entity = new Entity();
}