在Spring MVC中validation

如何在validation器类中获取请求对象,因为我需要validation内容,即请求对象中存在的参数。

不是100%肯定我正确地关注了你的问题,但是使用Spring MVC,你将对象传递给方法并注释它(至少在Spring 3中),如下所示:

@RequestMethod(value = "/accounts/new", method = RequestMethod.POST) public String postAccount(@ModelAttribute @Valid Account account, BindingResult result) { if (result.hasErrors()) { return "accounts/accountForm"; } accountDao.save(account); } 

这里的相关注释是@Valid,它是JSR-303的一部分。 包括BindingResult参数,以便您可以检查错误,如上所示。

你有两个选择:

  • JSR 303(Bean Validation)validation器
  • Spring Validators

对于JSR 303,您需要Spring 3.0并且必须使用JSR 303 Annotations注释您的Model类,并在Web Controller Handler方法中在您的参数前面编写@Valid。 (就像Willie Wheeler在他的回答中所示 )。 另外,您必须在配置中启用此function:

   

对于Spring Validators ,您需要编写实现org.springframework.validation.Validator接口的Validator(请参阅Jigar Joshi的答案 )。 您必须在Controller中注册Validator。 在Spring 3.0中,您可以在@InitBinder注释方法中使用WebDataBinder .setValidator.setValidator它是超类DataBinder

 Example (from the spring docu) @Controller public class MyController { @InitBinder protected void initBinder(WebDataBinder binder) { binder.setValidator(new FooValidator()); } @RequestMapping("/foo", method=RequestMethod.POST) public void processFoo(@Valid Foo foo) { ... } } 

有关更多详细信息,请参阅Spring参考,第5.7.4节Spring MVC 3validation 。

顺便说一句:在Spring 2中,SimpleFormController中有类似setValidator属性的东西。

使用简单的validation器(您的自定义validation器)您不需要请求对象来在Validator中获取参数。 你可以直接拿到它。

例如:这将检查来自请求的字段nameage

 public class PersonValidator implements Validator { /** * This Validator validates just Person instances */ public boolean supports(Class clazz) { return Person.class.equals(clazz); } public void validate(Object obj, Errors e) { ValidationUtils.rejectIfEmpty(e, "name", "name.empty"); Person p = (Person) obj; if (p.getAge() < 0) { e.rejectValue("age", "negativevalue"); } else if (p.getAge() > 110) { e.rejectValue("age", "too.darn.old"); } } } 

另见

  • 文献

您可以使用HttpServletRequest参数轻松添加另一个方法。

  public void validateReq(Object target, Errors errors,HttpServletRequest request) { // do your validation here } 

请注意,您没有在此处覆盖方法

当我使用springvalidation器validationvalidation码时,我也有同样的问题。 在validation器实现器中,我想从HttpSession(来自HttpServletRequest获取HttpSession)获取正确的validation码。

没有找到任何好的代码,以获得validation器,这么糟糕!

有一些折衷方案如下:

  1. 在绑定表单DTO中添加一个附加字段(call:correctCaptcha),在Controller方法中设置HttpSession的字段值,然后就可以在validation器中validation

     public class UserRegisterDto { private String correctCaptcha; //getter,setter } 
  2. 在绑定表单DTO中添加HttpServletRequest引用,然后可以在validation器中使用它。

     public class UserRegisterDto { private HttpServletRequest request; //getter ,setter } @RequestMapping(value = "register.hb", method = RequestMethod.POST) public String submitRegister(@ModelAttribute("formDto") @Valid UserRegisterDto formDto, HttpServletRequest request,BindingResult result) { formDto.setRequest(request); if (result.hasErrors()) { return "user_register"; } }