Spring MVC с аннотациями: как стать таким методом всегда вызывается - PullRequest
0 голосов
/ 28 марта 2010

В настоящее время я выполняю миграцию проекта, использующего 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 , но это похоже на изнасилование фреймворка: -).

У кого-нибудь есть (лучшая) идея?

1 Ответ

4 голосов
/ 28 марта 2010

Лучшим решением было бы использование HandlerInterceptor, через которое каждый запрос «проходит» на пути к контроллеру. Это потенциально может быть более хорошим решением, чем ваше оригинальное решение на основе подклассов.

Вы хотели бы реализовать метод preHandle в интерфейсе перехватчика. Недостатком является то, что интерфейс не так хорош, как использование аннотированных контроллеров, но для перехватчика тривиально перевести запрос на страницу с ошибкой.

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