Spring MVC-@init绑定器方法未调用

Spring MVC-@init绑定器方法未调用,spring,spring-mvc,spring-mvc-initbinders,Spring,Spring Mvc,Spring Mvc Initbinders,嗨,这是我的控制器 @RequestMapping(value="/home", method = RequestMethod.POST) public String homeSubmit(@Valid LoginForm loginForm , BindingResult bindResult){ if(bindResult.hasErrors() || bindResult.hasFieldErrors() ){ return "home"; }else{

嗨,这是我的控制器

@RequestMapping(value="/home", method = RequestMethod.POST)
public String homeSubmit(@Valid LoginForm loginForm , BindingResult bindResult){

    if(bindResult.hasErrors() ||  bindResult.hasFieldErrors() ){
        return "home";
    }else{
        return "Success";
    }
}

@InitBinder("loginForm")
protected void initBinder(WebDataBinder binder) {
    binder.setValidator(new LoginFormValidator());
}
下面是我的验证器

public class LoginFormValidator implements Validator {

    public boolean supports(Class<?> classz) {
        return LoginForm.class.equals(classz); 
    }

    public void validate(Object target, Errors arg1) {
        System.out.println("inside validate method validator");
        LoginForm loginForm = (LoginForm) target;
        if(! loginForm.getUserName().equalsIgnoreCase("xxx")  ){
            arg1.rejectValue("userName","Invalid Data");
        }
        if(! loginForm.getPassword().equalsIgnoreCase("yyy")){
            arg1.rejectValue("password","Invalid Data");
        }
    }
}
公共类LoginFormValidator实现验证程序{
公共布尔支持(类classz){
返回LoginForm.class.equals(classz);
}
公共无效验证(对象目标,错误arg1){
System.out.println(“内部验证方法验证器”);
LoginForm LoginForm=(LoginForm)目标;
如果(!loginForm.getUserName().equalsIgnoreCase(“xxx”)){
arg1.拒绝值(“用户名”,“无效数据”);
}
如果(!loginForm.getPassword().equalsIgnoreCase(“yyy”)){
arg1.拒绝值(“密码”、“无效数据”);
}
}
}

问题是我的验证器并没有全部被调用。每次条件
bindResult.hasErrors()| | bindResult.hasFieldErrors()
都是
false
。我也尝试过调试。并不是所有的验证器都被调用。

一种方法是将验证器实例化为服务,然后注入到控制器中。在模型上注释@Validated

@Autowired
@Qualifier("loginFormValidator")
private Validator validator;

@RequestMapping(value="/home", method = RequestMethod.POST)
public String homeSubmit(@Validated LoginForm loginForm , BindingResult bindResult){

    if(bindResult.hasErrors() ||  bindResult.hasFieldErrors() ){
        return "home";
    }else{
        return "Success";
    }
}
将验证器实例化为服务:

@Service("loginFormValidator")
public class LoginFormValidator implements Validator {

    public boolean supports(Class<?> classz) {
        return LoginForm.class.equals(classz); 
    }

    public void validate(Object target, Errors arg1) {
        System.out.println("inside validate method validator");
        LoginForm loginForm = (LoginForm) target;
        if(! loginForm.getUserName().equalsIgnoreCase("xxx")  ){
            arg1.rejectValue("userName","Invalid Data");
        }
        if(! loginForm.getPassword().equalsIgnoreCase("yyy")){
            arg1.rejectValue("password","Invalid Data");
        }
    }
}
@服务(“loginFormValidator”)
公共类LoginFormValidator实现验证程序{
公共布尔支持(类classz){
返回LoginForm.class.equals(classz);
}
公共无效验证(对象目标,错误arg1){
System.out.println(“内部验证方法验证器”);
LoginForm LoginForm=(LoginForm)目标;
如果(!loginForm.getUserName().equalsIgnoreCase(“xxx”)){
arg1.拒绝值(“用户名”,“无效数据”);
}
如果(!loginForm.getPassword().equalsIgnoreCase(“yyy”)){
arg1.拒绝值(“密码”、“无效数据”);
}
}
}

尝试在
@Valid
之前添加
@modelatrubute(“loginForm”)
,让我知道发生了什么绑定和验证是两件不同的事情。如果绑定失败,那么验证就没有意义。是不是调用了
initBinder
方法,还是没有调用您的验证器?我怀疑是第二个问题,而不是第一个问题,如果是,请修改问题的标题。