Spring MVC 3.0: как эффективно проверить переменную пути, которая является глобальной для всех сопоставлений запросов? - PullRequest
7 голосов
/ 14 января 2011

Я пытаюсь намочить ноги в Spring MVC 3.0, и хотя я могу заставить его работать, я не могу эффективно справиться с этим конкретным сценарием.

У меня есть контроллер с этим префиксом "/ {studyName} / module", и он выглядит примерно так: -

@Controller
@RequestMapping(value = "/{studyName}/module")
public class ModuleController {

    @RequestMapping(...)
    public ModelAndView getA(@PathVariable String studyName, ...) {
        if (!validStudy(studyName)) { return bad request; }
        ...
    }

    @RequestMapping(...)
    public ModelAndView getB(@PathVariable String studyName, ...) {
        if (!validStudy(studyName)) { return bad request; }
        ...
    }

    @RequestMapping(...)
    public ModelAndView getC(@PathVariable String studyName, ...) {
        if (!validStudy(studyName)) { return bad request; }
        ...
    }

    @RequestMapping(...)
    public ModelAndView getD(@PathVariable String studyName, ...) {
        if (!validStudy(studyName)) { return bad request; }
        ...
    }
}

Проблема с этим кодом заключается в том, что у меня есть проверка studyName, разбросанная по всем методам и, возможно, в методах других контроллеров. Есть ли способ, которым я могу выполнить проверку переменной пути studyName все в одном месте, не используя что-то вроде AOP? Как вы справляетесь с валидацией?

Спасибо.

Ответы [ 5 ]

2 голосов
/ 14 января 2011

Прямо сейчас немного сложно сделать это автоматически, но это возможно. Вам следует использовать провайдер проверки компонентов (JSR-303), который реализует приложение C. В настоящее время это Apache BeanValidation или Hibernate Validator 4.2 (который находится в бета-версии).

Добавьте выбранную реализацию проверки бина в путь к классам. Это будет реализация JSR-303, которую использует Spring MVC.

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

Это будет выглядеть примерно так:

public ModelAndView getB(@Valid @NonNull @PathVariable String studyName, ...) {

Это должно сработать. Затем вам нужно будет проверить ошибки Spring на наличие проблем.

В качестве альтернативы, если вы не используете какие-либо другие параметры Spring, вы можете зарегистрировать валидатор в InitBinder, например, так:

@InitBinder
public void initBinder(WebDataBinder binder) {
  binder.setValidator(new StudyNameValidator());
}
1 голос
/ 01 февраля 2011

Я начинаю использовать Spring 3, и мне нравится ваше решение проверки таким образом: public ModelAndView getB (@Valid @NonNull @PathVariable String studyName, ...) {

Однако, как толькоpathvariable недопустим (в данном случае studyName = null), как вы ловите и отображаете эту ошибку?

Я пытался использовать результат привязки, но он просто не работает.Кроме того, вы знаете, как отобразить ошибку на JSP?

Спасибо

1 голос
/ 14 января 2011

Создайте класс StudyName, зарегистрируйте WebArgumentResolver для StudyName и проведите там проверку.

   public ModelAndView getA(@PathVariable StudyName studyName){
      ...
   }

   public class StudyNameResolver implements WebArgumentResolver{
      //have resolveArgument method do validation if resolved to a StudyName
   }
0 голосов
/ 14 января 2011

Хммм, не уверен, что это сработает, но вы можете использовать аннотацию @Valid как , кратко упомянутую в этой ссылке на валидаторы.

Удачи!

0 голосов
/ 14 января 2011

Создать простой класс проверки:

public class StudyValidator {
    public boolean validateStudy(String studyName) {
        //your validate logic here
    }
}

затем введите его в ModuleController:

class ModuleController {
    private StudyValidator sv = new StudyValidator(); //use spring injection to populate.
    boolean validStudy(String studyName) {
        return sv.validateStudy(studyName);
    }
}

Simples.

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