我正在使用带有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 {
.....
答案 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;
}
}