如何在验证器类中获取请求对象,因为我需要验证内容,即请求对象中存在的参数。
答案 0 :(得分:9)
您有两种选择:
对于 JSR 303 ,您需要Spring 3.0并且必须使用JSR 303 Annotations注释您的Model类,并在Web Controller Handler方法中在您的参数前面编写@Valid。 (如Willie Wheeler show in his answer)。另外,您必须在配置中启用此功能:
<!-- JSR-303 support will be detected on classpath and enabled automatically -->
<mvc:annotation-driven/>
对于 Spring Validators ,您需要编写实现Jigar Joshi's answer接口的Validator(请参阅org.springframework.validation.Validator)。您必须在Controller中注册Validator。在Spring 3.0中,您可以使用@InitBinder
.setValidator
DataBinder
注释方法执行此操作(WebDataBinder它是超类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) { ... }
}
的方法<) / p>
setValidator
有关更多详细信息,请参阅Spring参考,第setValidator章。
BTW:在Spring 2中,SimpleFormController中有一个类似{{1}}属性的东西。
答案 1 :(得分:4)
使用简单验证器(您的自定义验证器) 您不需要请求对象来在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");
}
}
}
另见
答案 2 :(得分:1)
不是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参数,以便您可以检查错误,如上所示。
答案 3 :(得分:0)
您可以使用HttpServletRequest参数轻松添加另一个方法。
public void validateReq(Object target, Errors errors,HttpServletRequest request) {
// do your validation here
}
请注意,您没有覆盖此处的方法
答案 4 :(得分:0)
当我使用spring validator验证验证码时,我也有同样的问题。 在验证器实现器中,我想从HttpSession获取正确的验证码(来自HttpServletRequest获取HttpSession)。
在验证器中找不到任何好的代码,太糟糕了!!!
有一些折衷方案如下:
在绑定表单DTO中添加一个附加字段(call:correctCaptcha),在Controller方法中设置HttpSession的字段值,然后就可以在验证器中验证
public class UserRegisterDto {
private String correctCaptcha;
//getter,setter
}
在绑定表单DTO中添加HttpServletRequest引用,然后可以在验证器中使用它。
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";
}
}