如何在表单对象上重新运行Bean Validation? (Spring 4 MVC控制器)

时间:2014-05-16 17:29:40

标签: java spring spring-mvc bean-validation

我有使用JSR-303注释的简单模型

public class Article {
    ...
    @NotNull
    private String tag;
    ...
}

tag字段未暴露在表单中,而是填充在控制器的方法中

public class ArticleController {
   ...
   @RequestMapping(value = "/edit", method = PUT)
   public String doEdit(@Valid @ModelAttribute("article") final Article article,
                        final BindingResult bindingResult) {
    // generates article's tag, not editable by user
    article.setTag(generateTag(article));
    if (bindingResult.hasErrors()) {
        return "/edit";
    } else {
        service.save(article);
        return "redirect:/list";
    }
}

现在bindingResult始终在tag字段上没有空错误,因为bean在设置之前已经过验证。如何设置tag字段后重新验证文章bean并填充正确bindingResult

1 个答案:

答案 0 :(得分:2)

尝试

public class ArticleController {

    // inject the spring validator.
    @Autowired
    private LocalValidatorFactoryBean validator;

    @RequestMapping(value = "/edit", method = PUT)
    public String doEdit(@ModelAttribute("article") final Article article,
            final BindingResult bindingResult) {
        // generates article's tag, not editable by user
        article.setTag(generateTag(article));
        // validate
        validator.validate(article, bindingResult);

        if (bindingResult.hasErrors()) {
            return "/edit";
        } else {
            service.save(article);
            return "redirect:/list";
        }
    }
}