Как создать собственный валидатор для Sping MVC

Прикладное программирование Программирование на Java Java-рецепты Как создать собственный валидатор для Sping MVC

Помечено: ,

Просмотр 0 веток ответов
  • Автор
    Сообщения
    • #6198
      @admin
      StudLance.ru

      Задача
      Создать собственный произвольный валидатор для данных при использовании Spring MVC

      Решение
      Веб фреймворк Spring MVC обеспечивает валидацию данных введенных на форме посредством стандарта валидации бинов JSR-303.

      В общем случае в Spring MVC для того, чтобы происходила валидация введенных данных необходимо к бину данных применить аннотацию @Valid

      public String save(@ModelAttribute("command") @Valid FormData data, BindingResult result){
          if (result.hasErrors()){
             return "mysite/edit";
          }
          else{
             service.save(data);
             return "mysite/success"
          }
      }

      Объект типа org.springframework.validation.BindingResult содержит результаты валидации. В приведенном выше примере в случае если валидация прошла с ошибкой (введенные данные недостоверны), то возвращаемся назад на форму ввода данных, где можно отобразить сообщение об ошибках.

      Аттрибут @ModelAttribute необходим для того, чтобы связать данные с веб формой.

      Для реализации собственного валидатора, отличного от стандарта JSR-303 необходимо реализовать класс реализующий интерфейс org.springframework.validation.Validator

      public class MyCustomValidator implements Validator{
           
          /**
           * @see Validator#supports(Class)
           */
          public boolean supports(Class<?> clazz) {
              return clazz.equals(FormData.class);
          }
       
          /**
           * @see Validator#validate(Object, Errors)
           */
          public void validate(Object command, Errors errors){        
              FormData data = (FormData) command;
       
              if (null == data.getName()){
                  errors.reject("error.required.name");
              }
          }
      }

      В методe supports определяется поддерживается ли валидация для текущего класса бина.

      В методе validate осуществляется проверка достоверности данных. Если данные не достоверны, то у объекта errors вызывается метод reject с указанием кода ошибки. В дальнейшем данный код ошибки может использоваться в качестве ключа в ресурсах сообщений.

      Для более простой проверки заполннености полей формы, можно использовать вспомогательный класс org.springframework.validation.ValidationUtils

      /**
        * @see Validator#validate(Object, Errors)
        */
      public void validate(Object command, Errors errors){        
          ValidationUtils.rejectIfEmpty(errors, "name", "error.required.name");
      }

      После создания класса валидатора, необходимо связать данный класс с бином данных используемым в контроллере. Для этого необходимо в контроллер внедрить валидатор и указать имя бина к которому данный валидатор следует применить

      @Controller
      @RequestMapping("/mysite/edit")
      public class ListController {
           
          @Autowired
          @Qualifier("myValidator")
          private Validator validator;    
       
          @InitBinder(value="command")
          private void initBinder(WebDataBinder binder) {
              binder.setValidator(validator);
          }
       
          @RequestMapping(method=RequestMethod.POST)
          public String save(@ModelAttribute("command") @Valid FormData data, BindingResult result){
             if (result.hasErrors()){
                return "mysite/edit";
             }
             else{
                service.save(data);
                return "mysite/success"
             }
          }
      }

      В приведенном выше фрагменте кода аннотация @InitBinder связывает валидатор с бином данных по имени бина (в данном примере указывается имя "command").

      StudLance.ru

Просмотр 0 веток ответов
  • Для ответа в этой теме необходимо авторизоваться.
×