我已经制作了一个小型的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>
答案 0 :(得分:2)
在调用应用程序阶段调用<f:viewAction action>
之类的操作方法。在更新模型值阶段期间更新模型值。因此,当需要设置属性时,实体创建一个阶段太晚了,仍然是null
。
取消<f:viewAction>
并改为使用@PostConstruct
方法。
@PostConstruct
public void init() {
this.entity = new Entity();
}