Java springmvc中的验证

Java springmvc中的验证,java,spring,spring-mvc,validation,Java,Spring,Spring Mvc,Validation,如何在validator类中获取请求对象,因为我需要验证请求对象中的内容(即参数) 不是100%确定我是否正确地回答了您的问题,但是使用Spring MVC,您可以将对象传递到方法中并对其进行注释(至少使用Spring 3),如下所示: @RequestMethod(value = "/accounts/new", method = RequestMethod.POST) public String postAccount(@ModelAttribute @Valid Account accou

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

不是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参数,这样您就可以检查错误,如上图所示。

使用简单验证器(您的自定义验证器) 您不需要请求对象在验证器中获取参数。你可以直接从我这里拿到

例如:这将检查请求中名为
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");
        }
    }
}
公共类PersonValidator实现验证器{
/**
*此验证器只验证个人实例
*/
公共布尔支持(类clazz){
返回人.class.equals(clazz);
}
公共无效验证(对象obj,错误e){
ValidationUtils.rejectIfEmpty(e,“name”,“name.empty”);
人员p=(人员)obj;
if(p.getAge()<0){
e、 拒绝价值(“年龄”、“负面价值”);
}else if(p.getAge()>110){
e、 拒绝价值(“年龄”、“太老了”);
}
}
}
另请参见

    • 您有两种选择:

      • JSR303(Bean验证)验证器
      • 弹簧验证器

      对于JSR303您需要Spring3.0,并且必须使用JSR303注释来注释您的模型类,并在Web控制器处理程序方法中写入@Valid-front-your参数。(像)。此外,您必须在配置中启用此功能:

      <!-- JSR-303 support will be detected on classpath and enabled automatically -->
      <mvc:annotation-driven/>
      
      有关更多详细信息,请参阅Spring参考资料第章


      顺便说一句:在Spring2中,SimpleFormController中有一个类似于
      setValidator
      的属性

      您可以轻松添加另一个带有HttpServletRequest参数的方法

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

      请注意,您并没有在这里重写某个方法

      我在使用spring validator validate captcha时也遇到了同样的问题。 在验证器实现程序中,我希望从HttpSession(从HttpServletRequest get HttpSession)获取正确的captcha

      没有找到任何好的代码,让它在验证器,如此糟糕

      以下是一些折衷方案:

    • 在绑定表单DTO中添加一个附加字段(调用:correctCaptcha),在控制器方法中从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";
          }
      }
      

    • 设置SpringValidator会隐藏hibernate验证特性(JSR303)。有没有办法保持hibernate验证并额外使用自己的spring验证器?@Saram:我强烈建议使用JSR303而不是spring验证器。--不管怎样,如果你想问一些问题,就发布一个新问题。你可以使用
      binder.addValidator(newfoodalidator())将这两种验证方法结合起来。抱歉,这不起作用,也许使用SpringMVC拦截器是一个好的解决方案
      
      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";
          }
      }