JSF在commandButton操作之后重新加载ViewParam

时间:2018-08-13 23:15:55

标签: jsf primefaces converter

我正在使用JSF和Primefaces。我有一个带有f:viewParam的接收实体ID的edit.xhtml页面:

<f:viewParam name="id" value="#{backingBean.entity}" converter="entityConverter" />

我有两个commandButton,一个用于提交和保存实体:

<p:commandButton ajax="false" value="#{bundle.save}" 
action="#{backingBean.save()}"/>

另一个将项目添加到实体集合的方法:

<p:commandButton ajax="true" process="@this" value="#{bundle.add}" 
actionListener="#{backingBean.addItem()}" />

这是我的BackingBean:

@ViewScoped 
@Named("backingBean")
public class BackingBean {
  @EJB
  MyDAO myDAO;

  private Entity entity; //with getters and setters

  public void addItem() {
    entity.getData().add(new Item()); //another entity object
  }

  public void save(){
    myDAO.save(entity);
  }
...
}

我还有一个EntityConverter类,该类调用DAO并加载对象:

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
    try {
        return myDAO.findById(Entity.class, Long.valueOf(value));
    } catch (Exception e) {
        return null;
    }
}

如果我尝试添加多个项目或单击“保存”按钮,则通过调用转换器类的getAsObject方法来重新加载BackingBean类中的实体。

我做错了什么? 谢谢!

1 个答案:

答案 0 :(得分:2)

为清楚起见,正常的f:param将始终以这种方式运行。我在所有解决这些问题的项目OmniFaces ViewParam中都使用了

无状态模式,避免回发时不必要的转换,验证和模型更新

  

标准的UIViewParameter实现调用模型设置器   回发后再次。当绑定到一个   查看作用域Bean,合并时可能导致性能问题   与昂贵的转换器。为了解决这个问题,默认情况下此组件   将提交的值存储为组件属性,而不是存储在   模型(因此,在绑定到视图的情况下处于视图状态   范围豆)。

     

标准的UIViewParameter实现调用转换器并   验证者再次回发。当您不总是这样时   有必填=“ true”,但参数未保留在表单上   提交。您需要在每个命令中保留它   链接/按钮。为了解决这个问题,该组件不会调用   转换者和验证者再次回发。