为什么验证不起作用?

时间:2011-06-22 19:19:22

标签: java validation spring-mvc

我使用Spring Web MVC框架在java中编写Web应用程序。某种方式验证不起作用。 下面描述了控制器类:

@Controller
public class UserNameController 
{

    @InitBinder()
    protected void initBinder(WebDataBinder binder) {
        binder.setValidator(new UserNameValidator());
    }

          // 
        @RequestMapping(value="userName.htm", method=RequestMethod.POST)
        public String doForm(@ModelAttribute("user") @Valid User user, BindingResult result, Model model) 
        {         
            System.out.println("------------ "+ user.getuName()+" ---------");
            if (result.hasErrors()) {
                System.out.print("===== errors ======");
            }

            model.addAttribute("user",user);
            return "registration";
        }


  public class UserNameValidator implements Validator 
  {
    public boolean supports(Class clazz) 
    { System.out.println("========== "+User.class.isAssignableFrom(clazz)+" ===================");
       return User.class.isAssignableFrom(clazz);    
    }

     public void validate(Object target, Errors errors)
     {
         System.out.println("=======================");
         User newUser = (User) target;
         ValidationUtils.rejectIfEmptyOrWhitespace(errors, "uName", "field.required", "Required field");
         if(errors.hasFieldErrors("uName"))
         {
          //   if(user.existUser() == true)
            // {

             //}
             System.out.print("===== errors 2 ======");
         }

     }
  } 

}

虽然'validate'方法保持空闲,但调用方法'supports'会给出真值。有什么问题?

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"    
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

       <context:component-scan base-package="forum.web" />      


     <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/jsp/"
          p:suffix=".jsp" />         

</beans>

User.java源文件:

public class User
{

    private String uName;

    public User(){}

    public User(String uName)
    { System.out.println("=== Constructor==== " + uName);
        this.uName= uName;
    }
    public String toString()
    {System.out.println("=====toString()==== " + uName);
        return this.uName;
    }

    public String getuName()
    {
        return uName;
    }
    public void setuName(String uName)
    {
       this.uName = uName;  
    }
}

jsp页面的主要部分:

<form id="userName" action="userName.htm" method="post" accept="text/plain" accept-charset="UTF-8" enctype="application/x-www-form-urlencoded">

        <td>
        <label for> User Name: 
        </td> 
        <td> </td>
        <td> </td>
        <td>
            <form:errors path="uName"/>
        <input type="text" name="uName" maxlength="20" size="40" onmouseout="submitUName()" value="${user}"/> </p> </p>
        </td>
        <td>*</td>
        </form>       
    </tr> 

这是我更新的Controller(新版本):

@Controller
public class UserNameController 
{

   private Validator validator;

  public void setValidator(Validator validator)
   {
       this.validator= validator;
   }

    @InitBinder("user")
    protected void initBinder(WebDataBinder binder) {
        binder.setValidator(new UserNameValidator());
        System.out.println("A binder for object: =============== " + binder.getObjectName());
    }

        @RequestMapping(value="userName.htm", method=RequestMethod.POST)
        public String userName(@ModelAttribute("user") User user, BindingResult result, Model model) 
        {         
            this.validator.validate(user, result);
            System.out.println("------------ "+ user.getuName()+" ---------");
            if (result.hasErrors()) {
                System.out.print("===== errors ======");
            }

            model.addAttribute("user",user);
            return "registration";
        }

  public class UserNameValidator implements Validator 
  {
    public boolean supports(Class clazz) 
    { System.out.println("========== "+User.class.isAssignableFrom(clazz)+" ===================");
       return User.class.isAssignableFrom(clazz);    
    }

     public void validate(Object target, Errors errors)
     {
         System.out.println("=======================");
         User newUser = (User) target;
         ValidationUtils.rejectIfEmptyOrWhitespace(errors, "uName", "field.required", "Required field");
         if(errors.hasFieldErrors("uName"))
         {
          //   if(user.existUser() == true)
            // {

             //}
             System.out.print("===== errors 2 ======");
         }

     }
  }

}

虽然由于某些原因,此行this.validator.validate(user, result);会导致NullPointerException。无论如何,'validate'方法不会像上面那样被调用。 最好的问候

1 个答案:

答案 0 :(得分:2)

尝试指定绑定器将应用于哪个对象(模型属性或请求参数),例如@InitBinder( “用户”)。请注意,您可以提供一系列名称。

此外,您可以通过initBinder方法了解更多有关正在进行的操作的信息: System.out.println(“对象的绑定程序:”+ binder.getObjectName());

要检查的另一件事:您的JSP使用与控制器相同的名称。你的标签是什么样的?它是否正确设置了modelAttribute =“user”属性?