Как сохранить объект на http запросе уничтожить весной web 4.3 - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть объект, который представляет состояние пользователя с огромным количеством данных, и этот объект можно изменять несколько раз за один http-запрос, поэтому я хочу использовать одну из оптимизаций - сохранить этот объект только при уничтожении http-запроса.

Проблема в том, что когда я пытаюсь использовать аннотацию @PreDestroy для компонента области запроса, я не могу использовать зависимости области запроса, такие как HTTP-сеанс (например, вызов javax.servlet.http.HttpServletRequest#getSession()), поскольку DispatcherServlet сбрасывает все компоненты области запроса в org.springframework.web.servlet.FrameworkServlet#processRequest

            resetContextHolders(request, previousLocaleContext, previousAttributes);
            if (requestAttributes != null) {
                requestAttributes.requestCompleted();
            }

Метод, аннотированный PreDestroy, обычно используется для освобождения ресурсов, которые он удерживал, однако я хочу зафиксировать транзакцию, используя множество зависимостей, поэтому он не работает.

ЕстьЕсть ли какой-нибудь способ весной Web для вызова метода bean-компонента после вызова Servlet :: doService и перед сбросом bean-компонентов области запроса?

1 Ответ

0 голосов
/ 14 февраля 2019

вы можете использовать Global ServletContextListener.который должен зарегистрировать обратный вызов на уровне компонента, ServletContextListener регистрирует обратный вызов на уровне context.

public class MyServletContextListener
  implements ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        System.out.println(
          "Executed callback ContextListener.");
    }

    @Override
    public void contextInitialized(ServletContextEvent event) {
        // Triggers when context initializes
    }
}

Вам необходимо зарегистрировать его на ServletListenerRegistrationBean в классе конфигурации:

@Bean
ServletListenerRegistrationBean<ServletContextListener> servletListener() {
    ServletListenerRegistrationBean<ServletContextListener> srb
      = new ServletListenerRegistrationBean<>();
    srb.setListener(new MyServletContextListener());
    return srb;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...