无法分配ServletContext spring 3

问题描述 投票:0回答:1

我尝试在 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 上下文的类。

我查看了建议的答案:这里这里,但它不起作用。

java spring spring-mvc autowired
1个回答
4
投票

问题是您在未注册

refresh()
的情况下调用
ServletContext
,因此在初始化 Bean 时没有可用的。

摆脱这个电话

rootContext.refresh();

ContextLoaderListener
将负责呼叫
refresh()
构造函数 javadoc 解释了当作为参数传递的
ApplicationContext
未刷新时会发生什么:

如果上下文已刷新或未实现

ConfigurableWebApplicationContext
,则假设用户已根据其特定需求执行(或未执行)这些操作,则上述情况都不会发生。

© www.soinside.com 2019 - 2024. All rights reserved.