2011-04-07 110 views

回答

1

不是100%肯定,我正确地按照你的问题,但与Spring MVC的,你传递对象到方法和注释它(至少在春季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参数也是如此,因此您可以检查错误,如上所述。

4

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

例如:这将检查字段从要求符合名称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"); 
     } 
    } 
} 

请参见

9

你有两个选择:

  • JSR 303(Bean验证)验证
  • 春校验

对于JSR 303你需要春季3.0和必须注解与JSR 303个注解模型类,写一个@在Web控制器处理程序方法中,在您之前有效参数。 (如Willie Wheeler show in his answer)。 Additionaly你必须在配置启用此功能:

<!-- JSR-303 support will be detected on classpath and enabled automatically --> 
<mvc:annotation-driven/> 

对于春校验,你需要编写验证(见Jigar Joshi's answer)实现了org.springframework.validation.Validator接口。您必须在控制器中注册您的验证器。在Spring 3.0,你可以在注解的方法,一个@InitBinder做到这一点通过WebDataBinder.setValidatorsetValidator它是超类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 3 Validation

顺便说一句:在Spring 2中,SimpleFormController中有一些像setValidator属性。

+0

设置弹簧验证隐藏冬眠验证功能(JSR 303)。是否有任何方法来保持hibernate验证,并且使用自己的spring验证器? – Saram 2013-01-09 12:38:01

+0

@Saram:我强烈建议使用JSR 303而不是spring验证器。 - 无论如何,如果你想问一些问题,请发表一个新问题。 – Ralph 2013-01-09 12:59:18

+0

您可以使用'binder.addValidator(new FooValidator());'结合两种验证方法。 – shadowhorst 2016-06-30 20:00:23

0

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

public void validateReq(Object target, Errors errors,HttpServletRequest request) { 

     // do your validation here 
} 

注意,你是不是覆盖方法在这里

0

我也有同样的问题,当我使用的弹簧Validator是否验证码。 在验证实现器中,我想从HttpSession(从HttpServletRequest获取HttpSession)获取正确的验证码。

没有找到任何好的代码让它在验证器中,太糟糕了!

有一些折中的方案如下:

  1. 在装订形式DTO添加其他字段(拨打:correctCaptcha),在控制器方法设置从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"; 
        } 
    } 
    
+0

对不起,这是行不通的,也许使用Spring MVC拦截器是一个很好的解决方案 – monkeyk 2015-04-28 02:05:52