我尝试在 Util 类中使用 servletcontext.getRealPath 来加载文件资源(不是单元测试的一部分),但它不起作用。
我尝试两者都使用“implements ServletContextAware”:
@Component
public class Utils implements ServletContextAware{
private ServletContext servletContext;
@Override
public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;
System.out.println("**** "+servletContext);
}
}
这会抛出 NPE,因为 servletcontext 不是由 spring 分配的。
还有@Autowired路线:
@Component
public class Utils{
@Autowired
private ServletContext servletContext;
tomcat启动时抛出NoSuchBeanDefinitionException:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.servlet.ServletContext] found for dependency: expected at le
ast 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
我添加了初始化代码,以防万一我做错了什么,导致 Spring 注入正确的 bean。
public class WebAppInitializer implements WebApplicationInitializer {
private static Logger LOG = LoggerFactory.getLogger(WebAppInitializer.class);
@Override
public void onStartup(ServletContext servletContext) {
WebApplicationContext rootContext = createRootContext(servletContext);
configureSpringMvc(servletContext, rootContext);
FilterRegistration.Dynamic corsFilter = servletContext.addFilter("corsFilter", CORSFilter.class);
corsFilter.addMappingForUrlPatterns(null, false, "/*");
// configureSpringSecurity(servletContext, rootContext);
}
private WebApplicationContext createRootContext(ServletContext servletContext) {
AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
// rootContext.register(CoreConfig.class, SecurityConfig.class);
rootContext.register(CoreConfig.class);
rootContext.refresh();
servletContext.addListener(new ContextLoaderListener(rootContext));
servletContext.setInitParameter("defaultHtmlEscape", "true");
return rootContext;
}
CoreConfig.class:
@Configuration
public class CoreConfig {
@Bean
public CaptionFixture createCaptionFixture() {
return new CaptionFixture();
}
@Bean
public Utils createUtils () {
return new Utils();
}
}
Utils 是具有 servlet 上下文的类。
问题是您在未注册
refresh()
的情况下调用 ServletContext
,因此在初始化 Bean 时没有可用的。
摆脱这个电话
rootContext.refresh();
ContextLoaderListener
将负责呼叫 refresh()
。 构造函数 javadoc 解释了当作为参数传递的 ApplicationContext
未刷新时会发生什么:
如果上下文已刷新或未实现
,则假设用户已根据其特定需求执行(或未执行)这些操作,则上述情况都不会发生。ConfigurableWebApplicationContext