2016-10-24 3 views
2

Ich muss eine Service-Klasse mit Annotation @ Service Annotation in meiner Sitzung Listener-Klasse, wie ich einige DB-Operation auf Session zerstörten Methode durchführen müssen. Ich bin nicht in der Lage, die Dienstklasse automatisch zu starten, da ich den Listener in meiner web.xml hinzugefügt habe und es nicht mehr im Frühjahr verwaltet wird. Ich habe mehrere Optionen (Workarounds) ausprobiert, wie zum Beispiel eine Bean aus dem Anwendungskontext über den Servlet-Kontext, aber ich bekomme keine Beans auf diese Weise.Autowiring Bean im Session Listener

Im Folgenden sind meine Klassen: - MyService:

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

Session Zuhörer:

 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> 

Antwort

2

zuerst den Frühling Hörer Context installieren. In Ihrem eigenen Listener können Sie mit WebApplicationContextUtils auf den Kontext zugreifen. Es wird jedoch nicht automatisch gestartet, Sie müssen die benötigte Bean/den Service selbst holen.

+0

Ich hatte versucht, wie in Frage erwähnt, aber es hat nicht funktioniert. – Saumyaraj

Verwandte Themen