Почему проверка не работает? - PullRequest
1 голос
/ 22 июня 2011

Я пишу веб-приложение на Java, используя Spring Web MVC Framework.Как-то проверка не работает.Ниже изображен класс контроллера:

@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 ======");
         }

     }
  } 

}

Метод 'support' вызывается, что дает истинное значение, хотя метод 'validate' остается бездействующим.В чем проблема?

<?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
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 Ответ

2 голосов
/ 23 июня 2011

Попробуйте указать, к какому объекту (атрибуту модели или параметру запроса) будет применен механизм связывания, например, @InitBinder («пользователь»).Обратите внимание, что вы можете предоставить массив имен.

Кроме того, к вашему сведению, вы можете узнать больше о том, что происходит, сделав это в вашем методе initBinder: System.out.println ("Связыватель для объекта:"+ binder.getObjectName ());

Еще одна вещь, которую нужно проверить: ваш JSP использует те же имена, что и ваш контроллер.Как выглядит ваш тег?Правильно ли установлен атрибут modelAttribute = "user"?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...