Компонент автоматической проводки в прослушивателе сеанса

#spring #spring-mvc #session

#spring #spring-mvc #сессия

Вопрос:

Мне нужно автоматически подключить класс сервиса, аннотированный аннотацией @Service, в моем классе прослушивателя сеанса, поскольку мне нужно выполнить некоторую операцию с базой данных в методе, уничтоженном сеансом. Я не могу автоматически подключить класс service, поскольку я добавил прослушиватель в свой web.xml и он больше не управляется spring. Я попробовал несколько вариантов (обходных путей), таких как получение компонента из контекста приложения через контекст сервлета, но я не получаю никаких компонентов таким образом.

Ниже приведены мои классы:- MyService:

 @Service
@Transactional
public class FxTransactionService{
//some autowirings
public void performDBoperation(Long id)
{
//business logic
}
}
  

Прослушиватель сеанса:

      public class SessionHandler implements HttpSessionListener {
            private final Logger logger = LoggerFactory.getLogger(this.getClass());

            @Autowired
            private MyService myService;

            @Override
            public void sessionCreated(HttpSessionEvent arg0) {
                System.out.println("Session created");
                ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(arg0.getSession()
                    .getServletContext());
            System.out.println(Arrays.toString(context.getBeanDefinitionNames()));
//This gives me empty list
            }

            @Override
            public void sessionDestroyed(HttpSessionEvent arg0) {
    Long id = (Long) arg0.getSession().getAttribute("Id");
                myService.performDBoperation(id);

            }

        }
  

web.xml:

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd" >

<web-app>

    <display-name>Archetype Created Web Application</display-name>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <listener>
        <listener-class>com.abc.controller.SessionHandler</listener-class>
    </listener>

    <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener> 
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>/WEB-INF/classes/log4j.properties</param-value>
    </context-param>

    <filter>
        <filter-name>preAuthHeaderAdditionFilter</filter-name>
        <filter-class>com.abc.filter.PreAuthHeaderAdditionFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>preAuthHeaderAdditionFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- <filter> <filter-name>openEntityManagerInViewFilter</filter-name> <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class> 
        </filter> <filter-mapping> <filter-name>openEntityManagerInViewFilter</filter-name> 
        <url-pattern>/*</url-pattern> </filter-mapping> -->


</web-app>
  

Комментарии:

1. как вы это исправили?

2. @Saumyaraj вы нашли какое-либо решение для этого? Я нахожусь в аналогичной ситуации

Ответ №1:

Сначала установите ContextLoaderListener Spring listener. В вашем собственном прослушивателе вы можете получить доступ к контексту с помощью WebApplicationContextUtils. Однако это не автозапуск, вы должны самостоятельно получить требуемый компонент / сервис.

Комментарии:

1. Я пробовал это, как упоминалось в вопросе, но это не сработало.