2012-09-14 31 views
1

我正在使用Spring MVC和Spring Data,並且還配置了Spring Data的DomainClassConverter以自動將String id轉換爲相應的Domain類。Spring tag <form:option>不適用於Spring Data DomainClassConverter?

現在我執行使用標籤使用以客戶參考:

<form:select path="customer"> 
    <form:option value="" label="Select" /> 
    <form:options items="${customers}" itemValue="id" /> 
</form:select> 

導致在給定的HTML:

<select id="customer" name="customer" class="span6"> 
    <option value="">Select</option> 
    <option value="1">Customer A</option> 
    <option value="2">Customer B</option> 
    <option value="3">Customer C</option> 
</select> 

當提交與例如後客戶A選擇我得到像一個例外:

org.apache.jasper.JasperException: org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type @javax.validation.constraints.NotNull @javax.persistence.ManyToOne nl.kapsalonreflection.domain.Customer for value ''; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: The given id must not be null!; nested exception is java.lang.IllegalArgumentException: The given id must not be null! 

所收到的值應該是1,而不是「這沒有任何意義可言」。 我也調試接收到的請求參數,它僅包含客戶= 1(預期)

注意,InvalidDataAccessApiUsageException從春數據的DomainClassConverter來了,如果我刪除了此轉換器不會再出現問題。

我也調試的DomainClassConverter什麼,我可以看到它試圖掩蓋兩次。 首先用String值1(如預期的那樣),然後再用另一個空字符串調用,導致異常。

它得到的怪異,但...

當我與普通的HTML元素<option value="">Select</option>更換<form:option value="" label="Select" />那麼異常不會發生,因此只有1調用,以轉換方法與字符串1. 的奇怪的是,這兩個<form:option value="" label="Select" /><option value="">Select</option>產品相同的HTML輸出...

我無法解釋的行爲......雖然我seemm有一個「處理方法」與普通的HTML元素我想知道是什麼原因造成問題。

回答

6

注意org.apache.jasper.JasperException表明例外不會在數據綁定JSP繪製的期間發生。這與異常取決於<form:option value="" label="Select" />這一事實一致 - 在回發後渲染表單時正在處理此標記時拋出異常。

您觀察到的行爲可以解釋如下:爲了確定其選定狀態<form:option>試圖將其值與綁定到<form:select>的字段的值進行比較。如果綁定字段的值爲null,<form:option>只是將其值與null進行比較,那就是爲什麼您在初始表單呈現期間沒有得到此異常。否則,<form:option>會嘗試將其<value>轉換爲綁定字段的類型,並且value = ""會在此步驟中導致異常。

所以,你應該用null,而不是空字符串值 「沒有選擇的選擇」:

<form:option value="${null}" label="Select" /> 
+0

的'值= 「$ {NULL}」'的伎倆。非常感謝您的幫助,因爲我完全陷入困境,走錯了路。仍然無法解釋爲什麼DomainClassConverter嘗試轉換兩次。一次具有實際價值,一次具有空值'... –

0

您可能需要考慮安裝在這種情況下的屬性格式編輯器,因爲如果我看到代碼<form:options items="${customers}" itemValue="id" />您直接連接客戶列表的選項。我認爲它會自動獲取toString並顯示「Csutomer A」,「Customer B」等。理想情況下,您可能需要使用itemLabel形式:options標籤,或者您可能需要註冊屬性編輯器並將其附加到initBinder http://static.springsource.org/spring/docs/2.5.x/reference/validation.html#beans-beans-conversion

相關問題