我有一个 facelet 模板:
<f:metadata>
<o:viewParam name="id" value="#{homeBean.id}" />
</f:metadata>
<h:form>
<h:inputHidden value="#{homeBean.id}" />
<h:inputText value="#{homeBean.user.firstName}" />
<h:commandButton value="Submit" action="#{homeBean.onSave()}" />
</h:form>
和一个请求范围的bean:
@Named
@RequestScoped
public class HomeBean {
private Integer id;
private User user;
public void setId(Integer id) {
System.out.println("setId called");
user = // code for loading User entity bean with supplied id
}
// other accessors for id and user
}
初始页面加载效果很好,实体加载并显示在表单中,inputHidden 设置为实体 id。问题是提交抛出:
javax.el.PropertyNotFoundException - Target unreachable, base expression '. user' resolved to null
可能是因为 getUser 在 setId 之前被调用。我该如何解决这个问题?我真的很想拥有一个请求范围的 bean,我知道这可以通过至少 viewaccess 范围的 bean 轻松解决。
编辑:现在我注意到在流程验证阶段引发了异常,我最初认为在更新模型值阶段引发了异常。我将“private User”改为“private User user = new User()”,现在可以了,但感觉有点奇怪。
问候, 帕维尔