Java 通过context.addListener(…)添加RequstContextListener不会';不行。但是通过@Bean注释的方法添加它就可以了
我正在使用以下配置初始化具有Spring安全性的基本Spring引导应用程序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
@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服务器中。应用程序运行。