弹出3自动表单字段验证与文件上传

时间:2013-01-28 17:41:38

标签: java spring

我正在使用带有hibernate验证器的JSR 303验证,通过在控制器方法上指定@Valid来自动验证字段。验证工作正常。我知道在表单中添加了一个上传字段,并添加了一个@RequestParam(“file”)作为MultipartFile文件。现在它只有在提交时所有字段都有效时才有效,否则我得到404(错误请求)。如果我删除了@Valid注释,我会得到javax.validation.ConstraintViolationException,并且所有的状态500都是违反。

我正在使用Spring 3.2

我的表格:

    <form action="#springUrl("/admin/stores/save")" method="POST" enctype="multipart/form-data">
Name: 
  #springBind( "store.name" )
  <input type="text" 
    name="${status.expression}" 
    value="$!status.value" /><br>
......
   <input type="file" name="file" accept="image/*">

  <input type="submit" value="submit"/>
</form>

控制器:

@RequestMapping(value="/save", method = RequestMethod.POST)
    @Transactional
    public String save(@Valid @ModelAttribute Store store, @RequestParam("file") MultipartFile file, BindingResult bindingResult, ModelMap model) {
        if (bindingResult.hasErrors()) {
            model.addAttribute("message", "Failed");
            model.addAttribute("store", store);
            return "admin/stores/form";
        } else {
                .....

1 个答案:

答案 0 :(得分:4)

你的问题是方法参数顺序。 @ModelAttribute后面必须跟BindingResult个参数。查看Spring documentation并同时查看示例17.1。 BindingResult和@ModelAttribute 的排序无效。

。如果它是其中的一部分,您还应该将MultipartFile添加到表单类(Store)。

Store {

    /* Your other fields */

    @NotNull
    private  MultipartFile file;

    public MultipartFile getFile() {
        return file;
    }

    public void setFile(MultipartFile file) {
        this.file= file;
    }
}