2012-05-07 66 views
5

我有這樣的形式與參數yearname彈簧MVC不會綁定我的請求參數爲int

/register?year=&name=test 

我的類看起來是這樣的:

public class Organizer { 
    private String name; 
    private int year; 

我的控制器的映射兩個參數到我的班級Organizer

@RequestMapping("/register") 
public String register(@Valid Organizer organizer, BindingResult errors... 

問題是bindi將參數設置爲int。彈簧給我錯誤

無法將'java.lang.String'類型的屬性值轉換爲屬性'year'所需的類型'int';嵌套的例外是java.lang.IllegalArgumentException異常:

我想通了如何添加自己的自定義屬性編輯器,但getValue()似乎從來沒有被稱爲

@InitBinder 
public void binder(WebDataBinder binder) { 
    binder.registerCustomEditor(int.class, new CustomIntEditor()); 
} 

public class CustomIntEditor extends PropertyEditorSupport { 

我想我應該能夠返回int價值0當打之年的參數是任何其他比int值(Integer.parseInt() - >捕獲異常)

@Override 
public void setAsText(String text) throws IllegalArgumentException { 

    //Some parsing and error handling 
    setValue((int)0); 
} 

我想能夠:

  • 設置字段yearint價值0

  • 創建自定義錯誤消息:organizer.year.invalid

回答

7

變更int變爲Integer。這是一個自動裝箱問題。由於year爲空,因此無法將其轉換爲原始值(因爲您尚未指定默認值)。

然後你可以註釋它@NotNull得到你想要的驗證。

+0

是的工作!以爲我可以找到一種方法來使它只與int – Tommy

+1

我想你最初尋找的是一個'ConversionService'('binder.setConversionService(...)'),而不是'CustomEditor'。 ConversionService可以將字符串轉換爲整數,如果字符串爲空,則將整數設置爲0。我更喜歡使用非原始類型,因爲它使整個事情毫無意義:) – pap

+0

是的,轉換是我一直在尋找的功能! – Tommy

0

首先,嘗試運行在調試模式下的應用程序,並找出它拋出錯誤的確切線路並提供確切的詳細信息
我認爲ere必須是數據類型的問題(表單聲明) 如果您使用的是hibernate,請檢查您的hibernate實體類。

並檢查year屬性的數據類型。