В настоящее время я выполняю миграцию проекта, использующего Spring MVC без аннотаций, в Spring MVC с аннотациями. Это вызывает меньше проблем, чем ожидалось, но я столкнулся с одной проблемой.
В моем проекте я настроил механизм доступа. То, имеет ли пользователь доступ к определенному представлению, зависит не только от роли пользователя (например, это также зависит от статуса объекта, режима (просмотр / редактирование), ...). Для решения этой проблемы я создал абстрактный родительский контроллер, который имеет метод hasAccess . Этот метод вызывает также другие методы, такие как getAllowedEditStatuses , которые здесь и там переопределяются дочерними контроллерами.
Метод hasAccess вызывается из метода showForm (приведенный ниже код был свернут для вашей читабельности):
@Override
protected ModelAndView showForm(final HttpServletRequest request,
final HttpServletResponse response,
final BindException errors) throws Exception {
Integer id = Integer.valueOf(request.getParameter("ID"));
Project project = this.getProject(id);
if (!this.hasAccess(project, this.getActiveUser())) {
return new ModelAndView("errorNoAccess", "code", project != null ? project.getCode() : null);
}
return this.showForm(request, response, project, errors);
}
Итак, если у пользователя нет доступа к представлению, он перенаправляется на страницу с ошибкой.
Теперь «рассол»: как это настроить при использовании аннотаций. Больше нет showForm или другого метода, который всегда вызывается платформой.
Моя (и, возможно, ваша) первая мысль была: просто вызовите этот метод из каждого контроллера, прежде чем переходить к представлению. Это, конечно, сработает, но я надеялся на более приятное, более общее решение (меньше дублирования кода). Единственное другое решение, о котором я могу подумать, это предшествовать методу hasAccess аннотацией @ ModelAttribute , но это похоже на изнасилование фреймворка: -).
У кого-нибудь есть (лучшая) идея?