2014-01-29 55 views
2

我有一個表單,但是當我提交它時,我的initbinder不會攔截我的發佈請求。 這是我initbinder:爲什麼沒有initbinder調用提交表單?

@InitBinder(value="confermaDto") 
    protected void initBinderDto(final WebDataBinder binder, final Locale locale) { 
     binder.registerCustomEditor(MyClass.class, myClassEditor); 
    } 

這是我的方法攔截後:

@RequestMapping(value="confermaDati", method = RequestMethod.POST) 
public String confermaDati(@Valid final ConfermaDatiAttrezzaturaDto confermaDto, 
     final BindingResult bindingResult, final Model uiModel, final HttpServletRequest httpServletRequest) { 
    if (bindingResult.hasErrors()) { 
     uiModel.addAttribute("message", "Errore Salvataggio"); 
     uiModel.addAttribute("dto", confermaDto); 
    } 
    uiModel.asMap().clear(); 
    return "redirect:/"; 
} 

我認爲,它應該工作,因爲在initbinder的價值,我的模型attribure的名稱是平等的。 那麼爲什麼它不工作?

謝謝

回答

3

該init-binder方法應該適用的命令/表單屬性和/或請求參數的名稱。

缺省值適用於所有命令/表單屬性以及由註釋的處理程序類處理的所有請求參數。 這裏指定模型屬性名稱或請求參數名稱將init-binder方法限制爲那些特定屬性/參數,其中不同的init-binder方法通常應用於不同的屬性或參數組。

以上是來自javadoc@InitBinder

在您的代碼中,您指定要使用的模型屬性的名稱,即confermaDto。然而,在您的請求處理方法中,沒有模型屬性的概念(即沒有任何註釋與@ModelAttribute)。

public String confermaDati(@Valid final ConfermaDatiAttrezzaturaDto confermaDto, final BindingResult bindingResult, final Model uiModel, final HttpServletRequest httpServletRequest) { ... } 

您有@Valid註釋一個參數,它只會觸發驗證,春天還會將此對象實例,並把值從請求到它不過是指定爲一個模型屬性。在@Valid註釋旁邊添加註釋@ModelAttribute。 (或從@InitBinder註釋中刪除名稱,以便始終應用它)。

我認爲,它應該工作,因爲initbinder中的值和我的模型參數的名稱是相等的。那麼爲什麼它不工作?

總之要回答這個問題,方法參數的名字是平等的,但沒有模型屬性。因此沒有觸發@InitBinder方法。

3

如果沒有指定的ModelAttribute值到RequestMapping批註的方法你必須@Initbinder anotation類所需的名稱值屬性來指定與第一個字母資本。

+0

我還面臨同樣的問題和您的聲明**類所需的名字與第一個字母不大寫**救了我。謝謝 !! –