编辑没有反映在JPA支持bean中

时间:2018-01-09 06:33:35

标签: jsf primefaces master-detail

我一直在Creating master-detail table and dialog, how to reuse same dialog for create and edit Understanding PrimeFaces process/update and JSF f:ajax execute/render attributes关注@BalusC示例,尝试获取一个小表单来编辑某些数据,然后继续。但是,当我尝试保存数据时,我无法看到支持bean中反映的更改。

我有一个简单的表单,我预先填充了一些数据,我可以在保存之前进行编辑:

<h:form id="productSummaryForm">
    <h:panelGrid columns="2" columnClasses="label, value">
        <h:outputText value="Product name:" />
        <p:inputText id="productNameInputText" value="#{editProduct.product.productName}" required="true" requiredMessage="Enter Product Name" size="32">
            <p:watermark value="The name of the product" for="productNameInputText"/>
        </p:inputText>

        <h:outputText value="Output name:" />
        <p:inputText id="outputNameInputText" value="#{editProduct.product.outputName}" size="32">
            <p:watermark value="Output name" for="outputNameInputText"/>
        </p:inputText>
    </h:panelGrid>

    <h:panelGrid columns="3" styleClass="buttonPanelGrid">
        <p:commandButton value="Cancel"  immediate="true" action="#{productController.cancel}"/>
        <p:commandButton id="saveButton" value="Save" process="@this" immediate="true" action="#{editProduct.saveProduct}"/>
    </h:panelGrid>
</h:form>

控制器是:

@Named
@ViewScoped
public class EditProduct implements Serializable {

    private Product product;  // JPA Entity

    @Inject
    protected ProductService productService;

    public String saveProduct() {
        productService.saveProduct(product);
        return "/product?faces-redirect=true";
    }
}

当我在saveProduct()上进行调试时,我通过用户界面制作的所有修改都没有反映在我保存的product中。我已尝试将inputText ID添加到process属性(例如process="@this outputNameInputText"),但仍未反映这些更改。

我在saveButton上尝试的不同属性组合都没有改变任何内容,这让我觉得Product是问题所在:它是一个JPA实体。听起来不错吗?

1 个答案:

答案 0 :(得分:0)

因此, 在我的某个组件上出现了验证错误,我通过commandButton/commandLink/ajax action/listener method not invoked or input value not set/updated中的列表找到了该错误。在完成此过程和Understanding PrimeFaces process/update and JSF f:ajax execute/render attributes 的过程中,我发现有多种方法可以完成我需要的工作:

依赖于默认的PrimeFaces process="@form"行为:

<p:commandButton id="saveButton" value="Save" action="#{editProduct.saveProduct}"/>

或者,只是为了明确:

<p:commandButton id="saveButton" value="Save" process="@form" 
    action="#{editProduct.saveProduct}"/>

只处理PrimeFaces方式的某些表单字段:

<p:commandButton id="saveButton" value="Save" 
    process="@this outputNameInputText productNameInputText" 
    action="#{editProduct.saveProduct}"/>

并且,在没有PrimeFaces的情况下这样做:

<h:commandButton id="saveButton" value="Save" action="#{editProduct.saveProduct}">
    <f:ajax execute="@form" render="@all"/>
</h:commandButton>