我解決了這個問題,它是通過使用@RequestScoped而不是@SessionScoped我的頁面控制器豆引起的。
我在做什麼是使用編輯鏈接從數據表中傳遞當前產品對象到doEditProduct方法。
<h:dataTable id="viewProductsTable" value="#{productController.products}" var="_product"
styleClass="data-table" headerClass="table-header" rowClasses="table-row">
<h:column>
<f:facet name ="header">
<h:outputText value="Product Name" />
</f:facet>
<h:outputText value="#{_product.productName}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Goal"/>
</f:facet>
<h:outputText value="#{_product.goal}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Details"/>
</f:facet>
<h:outputText value="#{_product.description}"/>
</h:column>
<h:column>
<h:form>
<h:commandLink value="Edit" action="#{productController.doEditProduct(_product)}"/>
</h:form>
</h:column>
</h:dataTable>
的productController.doEditProduct方法然後打開編輯頁面
public String doEditProduct(Product product) {
this.product = product;
return "edit-product.xhtml";
編輯頁面包含一個簡單的編輯形式
<h:form id="addProductForm">
<h:panelGrid columns="2" columnClasses="top-alignment, top-alignment">
<h:outputLabel for="product-name" value="Product Name"/>
<h:outputText value="#{productController.product.productName}" id="product-name" />
<h:outputLabel for="goal" value="Goal" />
<h:inputTextarea value="#{productController.product.goal}" id="goal" rows="10" cols="100" />
<h:outputLabel for="details" value="Details" />
<h:inputTextarea value="#{productController.product.description}" id="details" rows="20" cols="100"/>
<f:facet name="footer">
<h:panelGroup style="padding-top: 15px; display: inline-block; float: right; white-space: nowrap">
<h:commandButton id="submit" value="Save" action="#{productController.updateProduct()}" class="button" />
<h:button id="Cancel" outcome="index.xhtml" value="Cancel" class="button"/>
</h:panelGroup>
</f:facet>
</h:panelGrid>
</h:form>
此時產品數據顯示在頁面上。然而,當點擊保存按鈕並運行更新方法時
public String updateProduct() {
try {
log.log(Level.INFO, "Updating: {0}", product.getGoal());
productFacade.edit(product);
} catch (Exception e) {
log.log(Level.WARNING, e.toString());
String errorMessage = getRootErrorMessage(e);
FacesMessage m = new FacesMessage(FacesMessage.SEVERITY_ERROR, errorMessage, "could not update product");
facesContext.addMessage(null, m);
return "";
}
return "index.xhtml";
任何已被禁用或只讀的字段被設置爲空。實際上,頁面上任何位置的任何非輸入字段都設置爲空。
控制器類上的@RequestScope意味着類正在被重新實例化,因此存儲在產品中的對象被分配了PostConstruct方法中的新對象。可編輯字段中的值被轉移到這個新對象,並且不可編輯字段被設置爲空。與數據庫合併意味着字段中的數據被刪除。
使用@SessionScoped意味着控制器bean跨頁請求繼續存在。 (我需要提醒自己的基本網頁生命週期)
希望這可以幫助任何其他人有這種行爲。
格雷厄姆
請問您可以發佈一些代碼。因爲我無法重現此行爲所有預期的工作,與殘疾人和只讀後提交值保持正常。 – pL4Gu33