2011-03-21 56 views
2

我想确认一些信息,所以我加了验证,并在POST方法的参数使用@Valid:春天验证从来没有所谓的

@Controller 
@RequestMapping("/user.htm") 
public class UserController { 

    @Autowired 
    private IUserService userService; 

    @RequestMapping(method = RequestMethod.GET) 
    public String userInfo(Model model) { 
     .... 
     return "user"; 
    } 

    @RequestMapping(method = RequestMethod.POST) 
    public String userInfoResult(@Valid @ModelAttribute UserForm userForm, BindingResult result, Model model) { 

     UserInfo stat = userService.getStatitisque(userForm.getSearchCritera()); 
     userForm.setListeExpediteur(listeExpediteur); 

     userForm.setUserInfo(stat); 
     model.addAttribute("userForm", userForm); 
    }  
} 

public class UserFormValidator implements Validator { 

    @Override 
    public boolean supports(Class<?> type) { 
     return UserForm.class.equals(type); 
    } 

    @Override 
    public void validate(Object o, Errors errors) { 
     UserForm userForm = (User) o; 
     ... 
    } 
} 

当我调试,我从来没有在UserFormValidator类。

我是否需要在这些文件中添加内容?

  • web.xml
  • applicationContext.xml
  • dispatcher-servlet.xml

回答

5

您需要添加验证在@InitBinder方法:通过XML

@InitBinder(value="YourFormObjectName") 
protected void initBinder(WebDataBinder binder) { 
    binder.setValidator(new FooValidator()); 
} 

或全局:

<mvc:annotation-driven validator="globalValidator"/> 

参考:

+2

我感到如此奇怪的是,春季需要您手动每个校验器类的添加到您的每个控制器时,它会自动执行几乎一切。这种特殊的API选择有什么理由吗? – LordOfThePigs 2014-09-01 21:06:39

+2

@LordOfThePigs你不必手动添加它 - 你可以写一些类似“ValidatorAdvice”的服务,它将使用''ControllerAdvice''注释。它会将您的验证器添加到每个控制器。示例: ''@ControllerAdvice public class ValidatorAdvice { @Autowired protected LocalValidatorFactoryBean validator; @InitBinder public void initBinder(WebDataBinder binder){ 活页夹。addValidators(new CollectionValidator(validator)); } }'' – thorinkor 2017-01-23 08:42:55

+0

@thorinkor没错,但是这个机制在我写这个答案时并不存在 – 2017-01-23 10:19:40

0

5.7.4.3配置JSR-303验证使用由Spring MVC

随着JSR-303,单一的javax .validation.Validator实例通常会验证声明验证约束的所有模型对象。要使用Spring MVC配置JSR-303支持的Validator,只需将类似Hibernate Validator的JSR-303提供程序添加到类路径。 Spring MVC将检测到它并自动启用跨所有控制器的JSR-303支持。

<mvc:annotation-driven/> 

有了这个最低配置,任何时候遇到@Valid @Controller输入,这将是由JSR-303供应商进行验证。反过来,JSR-303将执行针对输入声明的任何约束。任何ConstraintViolations将自动暴露为BindingResult可由标准Spring MVC窗体标记呈现的错误。

0
@Controller 
@RequestMapping("/user.htm") 
public class UserController { 
@Autowired 
private IUserService userService; 

@RequestMapping(method = RequestMethod.GET) 
public String userInfo(Model model) { 
    .... 
    return "user"; 
} 

@RequestMapping(method = RequestMethod.POST) 
public String userInfoResult(Model model, 
          @Valid @ModelAttribute UserForm userForm, 
          BindingResult result) { 
    /* 
     add custom validation check to standard validation error 
     (if not registry UserFormValidator in @InitBinder block) 
    */ 
    new UserFormValidator().validate(userForm, error); 

    // check all validation errors 
    if (errors.hasErrors()) { 
     // go back 
     return userInfo(model); 
    } 

    ... 
    } 
} 
+0

这是第三天,但@InitBinder之一是配置自定义验证器的所有可能方式中的首选 – 2012-01-20 11:15:57