【问题标题】:View parameter and @ViewScoped bean: recover after server restart查看参数和@ViewScoped bean:服务器重启后恢复
【发布时间】:2020-04-06 05:47:54
【问题描述】:

假设如下场景:

  • 在 Web 应用程序中,我在页面上有一个简单的表单,用户可以在其中更新数据库中的值;支持 bean 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
  • 当服务器再次启动时,用户想要提交表单
  • 在这种情况下,将调用控制器 bean 的 @PostConstruct,但正如预期的那样,转换器不会设置成员 myObject,从而导致 NullPointer 访问。

那么是否有任何建议的 JSF 方式来处理这种情况?我希望我已经清楚地表达了自己......

【问题讨论】:

  • 会话范围的 bean 是否在重启后仍然存在?
  • 对我来说,在使用 Tomcat 和 OpenWebBeans 时,在重新启动 Tomcat 会话时会保持并恢复。无论 state_saving_method 服务器|客户端如何,都不会再次为 viewScoped bean 调用 @PostConstruct。

标签: view-scope jsf-2.3 viewparams


【解决方案1】:

是的,@SessionScoped bean 上的行为相同,并且服务器被清理并重新启动。感谢您的链接,它帮助很大。

在我看来,唯一的解决方案是连接到@PostConstruct 并检查该成员是否为空。在这种情况下,我只需要自己重新初始化视图(默认情况下使用转换器完成)。

@PostConstruct
public void onPostConstruct() {

  if (Faces.isPostback() && this.myObject == null) {
    // Load object from database
    final long requestId = Long.valueOf(Faces.getRequestParameter("id"));
    setMyObject(objectService.get(requestId));
  }
}

这是一个正确的假设吗:当我在视图参数id 上有一些额外的验证器时,他们没有在@PostConstruct 中明确检查,因为回发请求传输“原始”id-值,所以这个必须是之前验证过的值,所以不能被用户篡改?

【讨论】:

    猜你喜欢
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 2021-09-11
    • 2011-06-02
    相关资源
    最近更新 更多