在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中获取参数。 你可以直接拿到它。
例如:这将检查来自请求的字段name
和age
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器,这么糟糕!
有一些折衷方案如下:
-
在绑定表单DTO中添加一个附加字段(call:correctCaptcha),在Controller方法中设置HttpSession的字段值,然后就可以在validation器中validation
public class UserRegisterDto { private String correctCaptcha; //getter,setter }
-
在绑定表单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"; } }