Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring HttpSessionListener实现内部的依赖项注入_Spring_Servlets_Web Applications_Dependency Injection_Web.xml - Fatal编程技术网

Spring HttpSessionListener实现内部的依赖项注入

Spring HttpSessionListener实现内部的依赖项注入,spring,servlets,web-applications,dependency-injection,web.xml,Spring,Servlets,Web Applications,Dependency Injection,Web.xml,问题:此注入依赖项将始终从SimpleController返回0 为什么在尝试向HttpSessionListener实现中注入依赖项时会丢失这个bean的上下文 这背后的原则是什么?我是否遗漏/混淆了这一点 我该如何解决这个问题 Github上的项目 考虑以下几点: SessionCounterListener public class SessionCounterListener implements HttpSessionListener { @Autowired private

问题:此注入依赖项将始终从
SimpleController返回0

  • 为什么在尝试向HttpSessionListener实现中注入依赖项时会丢失这个bean的上下文
  • 这背后的原则是什么?我是否遗漏/混淆了这一点
  • 我该如何解决这个问题
  • Github上的项目

    考虑以下几点:

    SessionCounterListener

    public class SessionCounterListener implements HttpSessionListener {
    
      @Autowired
      private SessionService sessionService;
    
      @Override
      public void sessionCreated(HttpSessionEvent arg0) {
        sessionService.addOne();
      }
    
      @Override
      public void sessionDestroyed(HttpSessionEvent arg0) {
        sessionService.removeOne();
      } 
    }
    
    @Component
    public SimpleController
    {
      @Autowired
      private SessionService sessionService;
    
      @RequestMapping(value="/webAppStatus")
      @ResponseBody
      public String getWebAppStatus()
      {
         return "Number of sessions: "+sessionService.getTotalSessions();
      }
    
    }
    
    web.xml

    <web-app ...>
        <listener>
            <listener-class>com.stuff.morestuff.SessionCounterListener</listener-class>
        </listener>
    
    </web-app>
    
    控制器:SimpleController

    public class SessionCounterListener implements HttpSessionListener {
    
      @Autowired
      private SessionService sessionService;
    
      @Override
      public void sessionCreated(HttpSessionEvent arg0) {
        sessionService.addOne();
      }
    
      @Override
      public void sessionDestroyed(HttpSessionEvent arg0) {
        sessionService.removeOne();
      } 
    }
    
    @Component
    public SimpleController
    {
      @Autowired
      private SessionService sessionService;
    
      @RequestMapping(value="/webAppStatus")
      @ResponseBody
      public String getWebAppStatus()
      {
         return "Number of sessions: "+sessionService.getTotalSessions();
      }
    
    }
    
    当您在web.xml中声明

    <listener>
        <listener-class>com.stuff.morestuff.SessionCounterListener</listener-class>
    </listener>
    
    不是
    web.xml
    中的有效条目。我不知道这是否是您的复制错误。

    当您在web.xml中声明

    <listener>
        <listener-class>com.stuff.morestuff.SessionCounterListener</listener-class>
    </listener>
    

    不是
    web.xml
    中的有效条目。我不知道这是否是您的复制错误。

    这是一个答案,显示了实际的解决方案

    您应该像这样修改SessionCountListener,上面的示例将起作用:

    public class SessionCounterListener implements HttpSessionListener {
    
      @Autowired
      private SessionService sessionService;
    
      @Override
      public void sessionCreated(HttpSessionEvent arg0) {
        getSessionService(se).addOne();
      }
    
      @Override
      public void sessionDestroyed(HttpSessionEvent arg0) {
        getSessionService(se).removeOne();
      }
    
      private SessionService getSessionService(HttpSessionEvent se) {
        WebApplicationContext context = 
          WebApplicationContextUtils.getWebApplicationContext(
            se.getSession().getServletContext());
        return (SessionService) context.getBean("sessionService");
      } 
    }
    

    这是一个显示实际解决方案的答案

    您应该像这样修改SessionCountListener,上面的示例将起作用:

    public class SessionCounterListener implements HttpSessionListener {
    
      @Autowired
      private SessionService sessionService;
    
      @Override
      public void sessionCreated(HttpSessionEvent arg0) {
        getSessionService(se).addOne();
      }
    
      @Override
      public void sessionDestroyed(HttpSessionEvent arg0) {
        getSessionService(se).removeOne();
      }
    
      private SessionService getSessionService(HttpSessionEvent se) {
        WebApplicationContext context = 
          WebApplicationContextUtils.getWebApplicationContext(
            se.getSession().getServletContext());
        return (SessionService) context.getBean("sessionService");
      } 
    }
    

    @stackoverflow请参阅解决方法。您不一定需要将其从web.xml中删除。如果这样做,则需要以不同的方式注册它(请参见
    ServletContext
    ServletContainerInitializer
    WebApplicationInitializer
    )。否则,您只需从
    ServletContext
    属性中获取当前的
    WebApplicationContext
    。因此,如果您理解您的“解决方法”链接提供的答案,请与我联系。基本上,只需从web.xml中删除侦听器并实现ServletContextListener接口(使用适当的Annation)。我应该准备好了吗?@stack No.
    ServletContextListener
    HttpSessionListener
    (请参阅javadoc)的用途不同,但它们的注册方式相同,即
    。在第二个链接中,它展示了如何使用
    WebApplicationListener
    。该接口允许您访问
    ServletContext
    ,在那里您可以通过编程注册一个侦听器。由于您可以访问Spring上下文,您可以让它提供一个
    SessionCounterListener
    bean并注册它。@stackoverflow不要混淆
    web.xml
    和Spring上下文文件,它们以
    声明开头<代码>是在Spring上下文文件中使用的Spring元素,而不是在web部署描述符中使用的。获取上下文的唯一方法是,如果我调用的每个DI实例都是SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(此);这似乎是一种可怕、笨拙的做法。现在,为了让事情顺利进行,我在整个项目中(在requestMappings上)进行了大约8次不同的调用@stackoverflow查看解决方法。您不一定需要将其从web.xml中删除。如果这样做,则需要以不同的方式注册它(请参见
    ServletContext
    ServletContainerInitializer
    WebApplicationInitializer
    )。否则,您只需从
    ServletContext
    属性中获取当前的
    WebApplicationContext
    。因此,如果您理解您的“解决方法”链接提供的答案,请与我联系。基本上,只需从web.xml中删除侦听器并实现ServletContextListener接口(使用适当的Annation)。我应该准备好了吗?@stack No.
    ServletContextListener
    HttpSessionListener
    (请参阅javadoc)的用途不同,但它们的注册方式相同,即
    。在第二个链接中,它展示了如何使用
    WebApplicationListener
    。该接口允许您访问
    ServletContext
    ,在那里您可以通过编程注册一个侦听器。由于您可以访问Spring上下文,您可以让它提供一个
    SessionCounterListener
    bean并注册它。@stackoverflow不要混淆
    web.xml
    和Spring上下文文件,它们以
    声明开头<代码>是在Spring上下文文件中使用的Spring元素,而不是在web部署描述符中使用的。获取上下文的唯一方法是,如果我调用的每个DI实例都是SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(此);这似乎是一种可怕、笨拙的做法。所以现在为了让事情顺利进行,我在整个项目中(在requestMappings上)打了8次电话