未反映在 JPA 支持 bean 中的编辑

Edits not reflected in JPA backing bean

我一直在关注 创建主从 table 和对话框中的@BalusC 示例,如何重用相同的对话框进行创建和编辑 Understanding PrimeFaces process/update and JSF f:ajax execute/render attributes,试图得到一个小表格来编辑一些数据然后坚持。但是,当我尝试保存数据时,我看不到支持 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() 上调试时,我通过 UI 所做的任何编辑都不会反映在我保存的 product 中。我已尝试将 inputText id 添加到 process 属性(例如 process="@this outputNameInputText"),但仍未反映更改。

None 我在 saveButton 上尝试的不同属性组合改变了任何东西,这让我认为 Product 是问题所在:它是一个 JPA 实体。听起来对吗?

因此, 我的一个组件出现了验证错误,这是我通过查看 commandButton/commandLink/ajax action/listener method not invoked or input value not set/updated 中的列表发现的。在完成这个和了解 PrimeFaces process/update 和 JSF f:ajax execute/render 属性的过程中 ,我发现有不止一种方法可以满足我的需要:

依赖默认的 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>