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
方法,还是没有调用您的验证器?我怀疑是第二个问题,而不是第一个问题,如果是,请修改问题的标题。