假设以下场景:
- 在 Web 应用程序中,我在页面上有一个简单的表单,用户可以在其中更新数据库中的值;支持豆
Controller
是@ViewScoped
。当使用 GET 参数加载页面时,将在自定义转换器中从数据库中读取保存该值的对象。
<!-- The details page for editing an object -->
<f:metadata>
<o:viewParam name="id" value="#{controller.myObject}" required="true">
<f:converter converterId="myObjectConverter" />
</o:viewParam>
</f:metadata>
<o:form includeViewParams="true">
<h:inputText id="desc" value="#{controller.myObject.myValue}" validatorMessage="Input invalid">
<f:validateRequired />
<f:validateLength minimum="1" />
</h:inputText>
<p:message for="desc" />
<h:commandButton action="#{controller.updateValue()}">
Save
</h:commandButton>
</o:form>
@Named
@ViewScoped
public class Controller implements Serializable {
// Getter/setter omitted
private MyObject myObject;
@PostConstruct
public void onPostConstruct() {
}
public String updateValue() {
// Persist myObject and return to list page
return "objects.xhtml?faces-redirect=true&id=" + myObject.getId();
}
}
- 现在用户导航到此页面,但没有单击按钮提交表单并保持浏览器窗口打开
- 同时服务器重启(注意:
javax.faces.STATE_SAVING_METHOD
设置为client
) - 当服务器再次启动时,用户想要提交表单
- 在这种情况下,
@PostConstruct
将调用控制器 bean,但正如预期的那样myObject
,转换器不会设置成员,从而导致 NullPointer 访问。
那么是否有任何建议的 JSF 方式来处理这种情况?我希望我已经清楚地表达了自己...