编辑未反映在 JPA 支持 Bean 中



我一直在按照创建主从表和对话框中的@BalusC示例进行操作,如何重复使用相同的对话框进行创建和编辑 以及了解PrimeFaces进程/更新和JSF f:ajax执行/渲染属性,尝试获取一个小表单来编辑一些数据,然后持久化。但是,当我尝试保存数据时,我看不到支持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 ids添加到process属性(例如process="@this outputNameInputText"(,但更改仍未反映出来。

我尝试过的属性的不同组合都没有改变saveButton,这让我认为Product问题所在:它是一个 JPA 实体。听起来对吗?

因此,我的一个组件上存在验证错误,我通过处理命令按钮/命令链接/ajax action/listener 方法中的列表未调用或未设置/更新输入值时发现该错误。在完成此操作的过程中,了解PrimeFaces进程/更新和JSF f:ajax执行/渲染属性,我发现有多种方法可以完成我需要的事情:

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

最新更新