Spring Controllers: могу ли я вызвать метод перед вызовом каждого метода @RequestMapping? - PullRequest
19 голосов
/ 23 февраля 2011

У меня есть некоторые общие компоненты, которые всегда присутствуют на каждой странице, обслуживаемой данным классом контроллера.

В начале каждого метода @RequestMapping я заполняю модель этими общими компонентами.

Есть ли способ определить метод, вызываемый перед каждым из методов контроллера, чтобы я мог получить всю эту копию / вставку в одном месте?

Ответы [ 5 ]

20 голосов
/ 23 февраля 2011

Просто аннотируйте метод с помощью @ModelAttribute

Ниже будет добавлен экземпляр Foo к модели под именем "foo"

@ModelAttribute("foo")
public Foo foo() {
    return new Foo();
}

См. Документацию @ModelAttribute

13 голосов
/ 13 марта 2014

Перехватчик является решением. У него есть методы preHandler и postHandler, которые будут вызываться до и после каждого запроса соответственно. Вы можете подключиться к каждому объекту HTTPServletRequest, а также пропустить несколько, копая его.

вот пример кода:

@Component
public class AuthCodeInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {

        // set few parameters to handle ajax request from different host
        response.addHeader("Access-Control-Allow-Origin", "*");
        response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
        response.addHeader("Access-Control-Max-Age", "1000");
        response.addHeader("Access-Control-Allow-Headers", "Content-Type");
        response.addHeader("Cache-Control", "private");

        String reqUri = request.getRequestURI();
        String serviceName = reqUri.substring(reqUri.lastIndexOf("/") + 1,
                reqUri.length());
                if (serviceName.equals("SOMETHING")) {

                }
        return super.preHandle(request, response, handler);
    }

    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {

        super.postHandle(request, response, handler, modelAndView);
    }
}
5 голосов
/ 25 сентября 2013

Все методы с аннотацией @ModelAttribute вызываются до того, как конкретный обработчик и возвращаемые значения добавляются в экземпляр модели.Затем вы можете использовать эти атрибуты в своих представлениях и в качестве параметров обработчика.

Я нашел этот блог очень полезным.

2 голосов
/ 23 февраля 2011

Да, вы можете использовать перехватчик .Вы можете определить их как <mvc:interceptors>

Другой вариант - использовать s Filter, но вы не сможете ввести в него пружинные бобы.

0 голосов
/ 24 марта 2019

Другой подход заключается в том, чтобы аннотировать класс контроллера как область действия запроса (@Scope('request')), чтобы каждый запрос создавал новый экземпляр контроллера для вызова соответствующего метода на нем.

Затем вы можете поместить всю свою предварительную обработку в метод пост-конструирования (т. Е. Обычный метод, помеченный @PostConstruct), который всегда будет вызываться после инициализации нового экземпляра контроллера (т. Е. Создания и разрешения всех зависимостей). ) и до вызова метода сопоставления запросов.

Я полагаю, что это было бы немного неэффективно, если инициализация контроллера тяжелая (например, дорогостоящие вычисления или много зависимостей для разрешения); но еще один подход к этой проблеме.

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