我有一个由 primefaces 数据表支持的 CRUD 表单。每次创建新实体时,都会更新表。但问题是创建只工作一次,同一视图中的后续请求不会触发支持 bean 操作。经过仔细检查,我发现唯一的区别是后续请求缺少javax.faces.ViewState
POST 数据中的属性,我认为最终会创建一个全新的 bean。
这是 JSF 2.2 的默认设置吗?
这是视图:
<h:form id="create">
<p:outputLabel value="label" for="inp"/>
<p:inputText id="inp" value="#{newJSFManagedBean.newEntity.foo}"/>
<p:commandButton action="#{newJSFManagedBean.create()}"
update="@form, :table" value="Create"/>
</h:form>
<br />
<p:dataTable value="#{newJSFManagedBean.entities}" var="entity"
id="table">
<p:column headerText="foo">#{entity.foo}</p:column>
</p:dataTable>
豆子:
@Named
@javax.faces.view.ViewScoped
public class NewJSFManagedBean implements Serializable {
private NewEntity newEntity;
@EJB
private NewEntityFacade entityFacade;
private Collection<NewEntity> entities;
@PostConstruct
private void init() {
newEntity = new NewEntity();
entities = entityFacade.findAll();
}
// ...
}
EJB 也是:
@Stateless
public class NewEntityFacade {
@PersistenceContext
private EntityManager em;
// ...
}