所以,这是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文件中运行,要么解释为什么它不起作用,以及我能做些什么。
答案 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
类,它同时实现了ServletContextAware
和WebMvcConfigurer
。
最后,事实证明,如果您在同一类上也实现了ServletContextAware.setServletContext()
,那么Spring Boot有一个错误(或至少没有文献记载的约束),永远不会调用WebMvcConfigurer
。解决方案就是简单地拆分一个单独的@Configuration
类来实现ServletContextAware
。
这是我发现的一个简单项目,它向我演示并解释了问题所在: https://github.com/dvntucker/boot-issue-sample
OP并没有显示所讨论的bean正在实现这两个,但是考虑到OP正在使用简化的示例代码,我想也许是问问问问问问题,Asker可能已经在其实际代码中同时实现了这两个接口,省略了第二个界面。