我正在使用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类中的实体。
我做错了什么? 谢谢!
答案 0 :(得分:2)
为清楚起见,正常的f:param将始终以这种方式运行。我在所有解决这些问题的项目OmniFaces ViewParam中都使用了
。无状态模式,避免回发时不必要的转换,验证和模型更新
标准的UIViewParameter实现调用模型设置器 回发后再次。当绑定到一个 查看作用域Bean,合并时可能导致性能问题 与昂贵的转换器。为了解决这个问题,默认情况下此组件 将提交的值存储为组件属性,而不是存储在 模型(因此,在绑定到视图的情况下处于视图状态 范围豆)。
标准的UIViewParameter实现调用转换器并 验证者再次回发。当您不总是这样时 有必填=“ true”,但参数未保留在表单上 提交。您需要在每个命令中保留它 链接/按钮。为了解决这个问题,该组件不会调用 转换者和验证者再次回发。