setServletContext未在@Configuration文件中激活

时间:2018-05-03 19:16:12

标签: java spring-boot

所以,这是this question的后续内容。我当前的代码看起来像这样:

@Configuration
@EnableAutoConfiguration
@ComponentScan(basePackages = {"base.pkg.name"})
public class MyApp implements ServletContextAware {

    private ThingDAO beanThingDAO = null;

    public MyApp() {
        // Lots of stuff goes here.
        // no reference to servletContext, though
        // beanThing gets initialized, and mostly populated.
    }

    @Bean publicD ThingDAO getBeanThingDAO() { return beanThingDAO; }

    public void setServletContext(ServletContext servletContext) {
        // all references to servletContext go here, including the
        // bit where we call the appropriate setters in beanThingDAO
    {
}

问题是,它不起作用。具体来说,我的理解是setServletContext应该在启动过程中的某些时候被各种形式的Spring Magic调用,但是(如System.out.println()所示)它永远不会被调用。我正在尝试完成一大堆重构的第一阶段,目前我能够完全处理@Configuration文件内部对servletContext的访问是值得注意的。我不是在寻找能告诉我应该把它放在控制器中的答案。我正在寻找一个答案,要么告诉我如何让它在@Configuration文件中运行,要么解释为什么它不起作用,以及我能做些什么。

2 个答案:

答案 0 :(得分:0)

好吧,我有一个答案。这不是我特别满意的人,所以我不会接受它,但如果有同样问题的人在这个问题上遇到困难,我想至少给他们一个好处。经验。

出于某种原因,ServletContextAware自动调用在这种情况下根本不起作用。但它适用于几乎所有其他组件。我创建了一个看起来像这样的kludge类:

// This class's only purpose is to act as a kludge to in some way get
// around the fact that ServletContextAware doesn't seem to work on MyApp.
// none of the *other* spring boot ways of getting the servlet context into a
// file seem to work either.
@Component
public class ServletContextSetter implements ServletContextAware {

    private MyApp app;

    public ServletContextSetter(MyApp app) {
        this.app = app;
    }

    @Override
    public void setServletContext(ServletContext servletContext) {
        app.setServletContext(servletContext);
    }
}

这份工作。我不喜欢它,我将在以后重建以使其不必要,所以我可以把它拿出来,但它确实有效。不过,如果有人能告诉我如何让它完全在@Configuration - 装饰文件中工作,或者为什么它不起作用,我会按住复选标记。那里。

请注意@Component装饰器在这里很重要。没有它就不会工作。

答案 1 :(得分:0)

我只是遇到了一个非常相似的问题,虽然我不是很肯定,但那是我想记录下来的解决方案,以防对他人有所帮助。

在我的情况下,我的Spring Boot应用程序只有一个@Configuration类,它同时实现了ServletContextAwareWebMvcConfigurer

最后,事实证明,如果您在同一类上也实现了ServletContextAware.setServletContext(),那么Spring Boot有一个错误(或至少没有文献记载的约束),永远不会调用WebMvcConfigurer。解决方案就是简单地拆分一个单独的@Configuration类来实现ServletContextAware

这是我发现的一个简单项目,它向我演示并解释了问题所在: https://github.com/dvntucker/boot-issue-sample

OP并没有显示所讨论的bean正在实现这两个,但是考虑到OP正在使用简化的示例代码,我想也许是问问问问问问题,Asker可能已经在其实际代码中同时实现了这两个接口,省略了第二个界面。