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

Я пытаюсь намочить ноги весной 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 ответов


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

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

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

это будет выглядеть так:

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

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

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

@InitBinder
public void initBinder(WebDataBinder binder) {
  binder.setValidator(new StudyNameValidator());
}

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

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

   public class StudyNameResolver implements WebArgumentResolver{
      //have resolveArgument method do validation if resolved to a StudyName
   }

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

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

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

спасибо


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

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.


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

Удачи!