Spring Validation с атрибутом BindingResult никогда не попадает в целевой метод контроллера

У меня есть форма, которую я отправил для загрузки файла:

<form id="uploadForm" action="#" method="POST" enctype="multipart/form-data">
    <div class="instruction popup_inst">
        <span class="popup_logo">[@spring.message "pandaLogo"/]</span>

        <div class="float_right">
            <input type="button" id="cancelBtn" class="btn" onclick="closePopupFunctionality();" value="[@spring.message "cancelButton"/]" />

            <input class="btn" type="submit" id="submit" onclick="validateFileInput();" value="[@spring.message "uploadButton"/]" />
        </div>

    </div>
    <span class="popup_title">[@spring.message "uploadFile"/]</span>
    <div class="popup_container">
        [@spring.bind "assayAssessmentsRequestBean"/]
        [@spring.formInput path="assayAssessmentsRequestBean.designabilityFile.file" fieldType="file" attributes="title='path' class='upload' accept='.txt,.csv,.zip'" /]
        [@spring.formHiddenInput path="assayAssessmentsRequestBean.dateOfAssessment" attributes="" /]
        [@spring.formHiddenInput path="assayAssessmentsRequestBean.id" attributes="" /]
        [@spring.showErrors " " "error" /]
    </div>
    <input id="uploadfile" type="hidden" value="${uploadfile}"/>
</form>

эта форма попадает в следующий метод в контроллере:

@RequestMapping(value = "/uploadFile",method= RequestMethod.POST)
    public ModelAndView uploadFile(@ModelAttribute(value = "assayAssessmentsRequestBean")AssayAssessmentsRequestBean assayAssessmentsRequestBean,HttpSession session,BindingResult result) throws PanDaApplicationException {
//mycode
}

происходит то, что метод никогда не вызывается, и когда я удаляю атрибут BindingResult, метод вызывается.

Я попробовал другой подход, который имеет атрибут BeanPropertyBindingResult и передает целевой объект для проверки, и он работает, но никогда не возвращает ошибок.

@RequestMapping(value = "/uploadFile",method= RequestMethod.POST)
    public ModelAndView uploadFile(@ModelAttribute(value = "assayAssessmentsRequestBean")AssayAssessmentsRequestBean assayAssessmentsRequestBean,HttpSession session/*,BindingResult result*/) throws PanDaApplicationException {
        logger.info(assayAssessmentsRequestBean.getDesignabilityFile().getFile());
        BindingResult result=new BeanPropertyBindingResult(assayAssessmentsRequestBean.getDesignabilityFile(),"designabilityFile");

person Muhammad Bekette    schedule 10.04.2013    source источник


Ответы (1)


у вас должна быть аннотация @Valid перед объектом, который вы хотите проверить, а BindingResult должен следовать сразу после проверенного объекта

так что это должно сделать работу

 public ModelAndView  uploadFile(@Valid @ModelAttribute(
    value = "assayAssessmentsRequestBean")AssayAssessmentsRequestBean   assayAssessmentsRequestBean,BindingResult result,
HttpSession session) {

 }

затем вы должны определить свой собственный валидатор и установить его в привязку. Валидатор будет вызван автоматически. Но я не уверен, что вы можете сделать проверку на многочастности таким образом.

person Josef Procházka    schedule 10.04.2013
comment
на самом деле это сработало, причина была в том, что я цитирую вас думаю, что BindingResult должен следовать сразу после проверенного объекта спасибо :-) - person Muhammad Bekette; 11.04.2013
comment
Вы можете убрать мнение, что BindingResult должен следовать сразу после проверенного объекта, и заменить BindingResult на BindingResult, должен следовать сразу после проверенного объекта. (а этот пост только что спас мой рассудок!) - person Crunch; 13.01.2016