Java 通过context.addListener(…)添加RequstContextListener不会';不行。但是通过@Bean注释的方法添加它就可以了

Java 通过context.addListener(…)添加RequstContextListener不会';不行。但是通过@Bean注释的方法添加它就可以了,java,spring,spring-mvc,spring-security,spring-boot,Java,Spring,Spring Mvc,Spring Security,Spring Boot,我正在使用以下配置初始化具有Spring安全性的基本Spring引导应用程序 @SpringBootApplication public class Application extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Override

我正在使用以下配置初始化具有Spring安全性的基本Spring引导应用程序

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        super.onStartup(servletContext);
        servletContext.addListener(new RequestContextListener());
    }
}
当试图访问
UserDetailsService
中的
@Autowired
HttpServletRequest
时,我遇到了一个与在正确上下文之外访问请求相关的
IllegalStateException
。(“未找到线程绑定请求”)

但是,当我这样配置应用程序时:

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        super.onStartup(servletContext);
    }

    @Bean
    public RequestContextListener requestContextListener() {
        return new RequestContextListener();
    }
}

使用该
@Autowired
依赖项时调用的Spring代理按预期工作。当我看到大量的Spring引导配置示例时,我想知道为什么后者会起作用,这些示例只需调用
.addListener()
,并使用
RequestContextListener

显示至少一个。使用.addListener方法在servlet上下文上设置RequestContextListener的每个示例。只有在部署应用程序时,如果运行嵌入式war(或jar),
SpringBootServletInitializer
不起任何作用,示例才会起作用。这也是
@Bean
可以工作的原因,因为boot会检测到这些,并以适当的方式为您注册它们。另外,imho注入一个
HttpServletRequest
是一件不好的事情,但这就是imho,它部署在Tomcat服务器中。应用程序正在运行。请至少显示一个。使用.addListener方法在servlet上下文上设置RequestContextListener的每个示例。只有在部署应用程序时,如果运行嵌入式war(或jar),
SpringBootServletInitializer
不起任何作用,示例才会起作用。这也是
@Bean
可以工作的原因,因为boot会检测到这些,并以适当的方式为您注册它们。另外,imho注入一个
HttpServletRequest
是一件不好的事情,但这就是imho,它部署在Tomcat服务器中。应用程序运行。