在Spring MVC中验证

时间:2011-04-07 06:12:57

标签: java spring spring-mvc validation

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

5 个答案:

答案 0 :(得分:9)

您有两种选择:

  • JSR 303(Bean验证)验证器
  • Spring Validators

对于 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中获取参数。你可以直接从中获取它。

例如:这将检查名称为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");
        }
    }
}

另见

答案 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)。

在验证器中找不到任何好的代码,太糟糕了!!!

有一些折衷方案如下:

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

    public class UserRegisterDto {
        private String correctCaptcha;
        //getter,setter
    }
    
  2. 在绑定表单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";
        }
    }