Валидация в Spring MVC - PullRequest
       3

Валидация в Spring MVC

5 голосов
/ 07 апреля 2011

как получить объект запроса в классе валидатора, так как мне нужно проверить содержимое, то есть параметры, присутствующие в объекте запроса.

Ответы [ 5 ]

9 голосов
/ 07 апреля 2011

У вас есть два варианта:

  • Валидаторы JSR 303 (проверка бобов)
  • Пружинные валидаторы

Для JSR 303 вам нужен Spring 3.0, и вы должны аннотировать ваш класс Model с помощью аннотаций JSR 303 и написать @Valid перед вашим параметром в методе обработчика веб-контроллера.(как шоу Вилли Уилера в его ответе ).Кроме того, вы должны включить эту функцию в конфигурации:

<!-- JSR-303 support will be detected on classpath and enabled automatically -->
<mvc:annotation-driven/>

Для пружинных валидаторов , вам необходимо написать свой валидатор (см. ответ Джигара Джоши )который реализует интерфейс org.springframework.validation.Validator .Вы должны зарегистрировать свой валидатор в контроллере.В Spring 3.0 вы можете сделать это в аннотированном методе @InitBinder, используя WebDataBinder .setValidator ( setValidator это метод суперкласса DataBinder)

Example (from the spring docu)
@Controller
public class MyController {

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

    @RequestMapping("/foo", method=RequestMethod.POST)
    public void processFoo(@Valid Foo foo) { ... }
}

Для получения более подробной информации, посмотрите ссылку на Spring, глава 5.7.4 Проверка Spring MVC 3 .

Кстати: в Spring 2 было что-токак setValidator свойство в SimpleFormController.

4 голосов
/ 07 апреля 2011

Использование простого валидатора (ваш собственный валидатор) Вам не нужен объект запроса, чтобы получить параметр в Validator. Вы можете напрямую получить его от.

Например: будет проверено поле из запроса с именами name и age

public class PersonValidator implements Validator {

    /**
    * This Validator validates just Person instances
    */
    public boolean supports(Class clazz) {
        return Person.class.equals(clazz);
    }

    public void validate(Object obj, Errors e) {
        ValidationUtils.rejectIfEmpty(e, "name", "name.empty");
        Person p = (Person) obj;
        if (p.getAge() < 0) {
            e.rejectValue("age", "negativevalue");
        } else if (p.getAge() > 110) {
            e.rejectValue("age", "too.darn.old");
        }
    }
}

См. Также

1 голос
/ 07 апреля 2011

Не уверен на 100%, что я правильно понимаю ваш вопрос, но в Spring MVC вы передаете объект в метод и комментируете его (по крайней мере, в Spring 3), например:

@RequestMethod(value = "/accounts/new", method = RequestMethod.POST)
public String postAccount(@ModelAttribute @Valid Account account, BindingResult result) {
    if (result.hasErrors()) {
        return "accounts/accountForm";
    }

    accountDao.save(account);
}

Соответствующая аннотация здесь @Valid, которая является частью JSR-303.Также включите параметр BindingResult, чтобы у вас была возможность проверять наличие ошибок, как показано выше.

0 голосов
/ 27 апреля 2015

У меня также есть та же проблема, когда я использую капчу валидатора валидатора валидатора. В разработчике валидатора я хочу получить правильную капчу из HttpSession (из HttpServletRequest получить HttpSession).

Не найдено хороших кодов для получения в валидаторе, так плохо !!!

Есть несколько компромиссных предложений:

  1. В форме привязки DTO добавьте дополнительное поле (call: correctCaptcha), в методе Controller установите значение поля из HttpSession, затем вы можете проверить в валидаторе

    public class UserRegisterDto {
        private String correctCaptcha;
        //getter,setter
    }
    
  2. Добавьте ссылку HttpServletRequest в форму привязки DTO, затем можете использовать ее в валидаторе.

    public class UserRegisterDto {
        private HttpServletRequest request;
        //getter ,setter
    }
    
    @RequestMapping(value = "register.hb", method = RequestMethod.POST)
    public String submitRegister(@ModelAttribute("formDto") @Valid UserRegisterDto formDto, HttpServletRequest request,BindingResult result) {
        formDto.setRequest(request);
        if (result.hasErrors()) {
            return "user_register";
        }
    }
    
0 голосов
/ 27 декабря 2013

Вы можете легко добавить другой метод с параметром HttpServletRequest.

 public void validateReq(Object target, Errors errors,HttpServletRequest request) {

       // do your validation here
}

Обратите внимание, что вы не переопределяете метод здесь

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