Spring验证器从未调用过

red*_*x26 2 java validation spring spring-mvc

我试图验证一些信息,所以我添加了一个验证器并在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;
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

当我调试时,我从未进入UserFormValidator类.

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

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

Sea*_*oyd 5

您需要在@InitBinder方法中添加验证器:

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

或通过XML全局:

<mvc:annotation-driven validator="globalValidator"/>
Run Code Online (Sandbox Code Playgroud)

参考:

  • 我觉得很奇怪Spring要求你自动将每个验证器类手动添加到每个控制器中.这种特殊的API选择有什么理由吗? (2认同)
  • @LordOfThePigs您不必手动添加它 - 您可以编写类似"ValidatorAdvice"服务的东西,它将使用``@ReaderAdvice``注释.它会将验证器添加到每个Controller.示例:``@ControllerAdvice public class ValidatorAdvice {@Autowired protected LocalValidatorFactoryBean validator; @InitBinder public void initBinder(WebDataBinder binder){binder.addValidators(new CollectionValidator(validator)); `` (2认同)