2012-11-28 77 views
2

我被困在轉換器和綁定的問題中。 我有一個網頁的表單:選擇在哪裏綁定對象的名單與項目值彈簧窗體:select不顯示帶有「selected」屬性選項

<form:select id="id_a" items="${items}" path="builder" itemValue="id" /> 

我創建2轉換器,轉換這個bean。一個從bean轉換爲顯示描述的字符串,另一個從id轉換爲從DB獲取bean。

private Converter<BuilderType, String> getBuilderTypeToStringConverter(){ 
    return new Converter<BuilderType, String>(){ 
     public String convert(BuilderType builder){ 
      return builder.getDescription(); 
     } 
    }; 
} 

private Converter<String,BuilderType> getStringToBuilderTypeConverter(){ 
    return new Converter<String, BuilderType>(){ 
     public BuilderType convert(String id){ 
      return builderService.findById(new Long(id)); 
     } 
    }; 
} 

所以,當我創建bean一切正常,我看到在選擇欄的描述,當提交ID到達控制器之前被轉化爲對現實豆,放入模型屬性的形式。

問題是當我嘗試更新時,我的選擇仍然正確填充,但實際值未選中。沒有選項使用屬性「selected」來正確初始化select。

這真的很奇怪,因爲我有一個春季roo的示例應用程序(petclinic),實際上使用相同類型的轉換器正確填充了select。

我發現得到這個工作的唯一方法是有點是添加「.ID」的路徑:

<form:select id="id_a" items="${items}" path="builder.id" itemValue="id" /> 

但在提交我收到回控制器中的空‘建設者’這樣只有id集合,而不是正確的轉換器被調用時我正常接收的comprete對象。

我真的不知道兩個應用程序之間的區別是什麼使得一個工作而不是另一個...甚至春天庫版本是相同的!

回答

2

我發現了這個問題。看來,在運行的應用程序有我沒有使用其他過濾器,只需添加的web.xml文件這讓一切都很好地工作:

<filter> 
    <filter-name>Spring OpenEntityManagerInViewFilter</filter-name> 
    <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>Spring OpenEntityManagerInViewFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

,因爲無處我發現,這是強制性的還是這真的很奇怪即使與彈簧標籤沒有任何聯繫,也可以按預期工作!

0

我認爲你應該爲實體類(BuilderType)定義equals方法,並通過id比較實例。否則,表單生成無法從選項的項目列表中找到當前值。

您可以通過在BuilderType中實現時檢查等於等於的調用來驗證此情況。

我面臨同樣的問題,並能夠通過this commentSpring Data book中的示例代碼(AbstractEntity.java)的幫助來解決它。

+0

正如我所說,它已經解決了在配置上面的過濾器,並且沒有改變與問題發佈的代碼。仍然不知道爲什麼沒有說這是必需的,使事情工作。 – Massimo

相關問題