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 аннотации как кратко упоминается в этой ссылке на валидаторы.
Удачи!