如何访问 @Configuration 或 @SpringBootApplication 中的 ServletContext class
How to get access to ServletContext inside of an @Configuration or @SpringBootApplication class
我正在尝试更新旧的 Spring 应用程序。具体来说,我试图将所有 bean 从旧的 xml 定义的形式中提取出来,并将它们提取成 @SpringBootApplication 格式(同时大大减少了定义的 bean 总数,因为他们中的许多人不需要是豆子)。我当前的问题是我不知道如何使 ServletContext 可用于需要它的 bean。
我当前的代码如下所示:
package thing;
import stuff
@SpringBootApplication
public class MyApp {
private BeanThing beanThing = null;
@Autowired
private ServletContext servletContext;
public MyApp() {
// Lots of stuff goes here.
// no reference to servletContext, though
// beanThing gets initialized, and mostly populated.
}
@Bean public BeanThing getBeanThing() { return beanThing; }
@PostConstruct
public void populateContext() {
// all references to servletContext go here, including the
// bit where we call the appropriate setters in beanThing
}
}
我返回的错误:Field servletContext in thing.MyApp required a bean of type 'javax.servlet.ServletContext' that could not be found.
所以...我错过了什么?有什么我应该添加到路径中的吗?我需要实现一些接口吗?我无法自己提供 bean,因为重点是我正在尝试访问我自己没有的 servlet 上下文信息(getContextPath() 和 getRealPath() 字符串)。
请注意访问 ServletContext
的最佳做法:您不应该在主应用程序 class 中这样做,但是 e. G。控制器。
否则尝试以下操作:
实现ServletContextAware
接口,Spring会为你注入。
删除变量 @Autowired
。
添加setServletContext
方法。
@SpringBootApplication
public class MyApp implements ServletContextAware {
private BeanThing beanThing = null;
private ServletContext servletContext;
public MyApp() {
// Lots of stuff goes here.
// no reference to servletContext, though
// beanThing gets initialized, and mostly populated.
}
@Bean public BeanThing getBeanThing() { return beanThing; }
@PostConstruct
public void populateContext() {
// all references to servletContext go here, including the
// bit where we call the appropriate setters in beanThing
}
public void setServletContext(ServletContext servletContext) {
this.context = servletContext;
}
}
使 bean 惰性并使用参数:
@Lazy
@Bean
public BeanThing getBeanThing(ServletContext servletContext) {
return new BeanThing(servletContext);
}
它需要是惰性的,因为在创建 MyApp
的实例时 ServletContext
将不存在。当 ServletContext
可用时,Spring 会记住它的某个地方,并且可以填写参数。
要使这项工作正常进行,您只需确保在此之前未请求该 bean。
现在您可能必须先创建需要 BeanThing
的 bean。然后解决方案是注入一个 Provider<BeanThing>
并确保提供者仅在 ServletContext
存在之后使用(即不在 @PostConstruct
或类似的)。
我正在尝试更新旧的 Spring 应用程序。具体来说,我试图将所有 bean 从旧的 xml 定义的形式中提取出来,并将它们提取成 @SpringBootApplication 格式(同时大大减少了定义的 bean 总数,因为他们中的许多人不需要是豆子)。我当前的问题是我不知道如何使 ServletContext 可用于需要它的 bean。
我当前的代码如下所示:
package thing;
import stuff
@SpringBootApplication
public class MyApp {
private BeanThing beanThing = null;
@Autowired
private ServletContext servletContext;
public MyApp() {
// Lots of stuff goes here.
// no reference to servletContext, though
// beanThing gets initialized, and mostly populated.
}
@Bean public BeanThing getBeanThing() { return beanThing; }
@PostConstruct
public void populateContext() {
// all references to servletContext go here, including the
// bit where we call the appropriate setters in beanThing
}
}
我返回的错误:Field servletContext in thing.MyApp required a bean of type 'javax.servlet.ServletContext' that could not be found.
所以...我错过了什么?有什么我应该添加到路径中的吗?我需要实现一些接口吗?我无法自己提供 bean,因为重点是我正在尝试访问我自己没有的 servlet 上下文信息(getContextPath() 和 getRealPath() 字符串)。
请注意访问 ServletContext
的最佳做法:您不应该在主应用程序 class 中这样做,但是 e. G。控制器。
否则尝试以下操作:
实现ServletContextAware
接口,Spring会为你注入。
删除变量 @Autowired
。
添加setServletContext
方法。
@SpringBootApplication
public class MyApp implements ServletContextAware {
private BeanThing beanThing = null;
private ServletContext servletContext;
public MyApp() {
// Lots of stuff goes here.
// no reference to servletContext, though
// beanThing gets initialized, and mostly populated.
}
@Bean public BeanThing getBeanThing() { return beanThing; }
@PostConstruct
public void populateContext() {
// all references to servletContext go here, including the
// bit where we call the appropriate setters in beanThing
}
public void setServletContext(ServletContext servletContext) {
this.context = servletContext;
}
}
使 bean 惰性并使用参数:
@Lazy
@Bean
public BeanThing getBeanThing(ServletContext servletContext) {
return new BeanThing(servletContext);
}
它需要是惰性的,因为在创建 MyApp
的实例时 ServletContext
将不存在。当 ServletContext
可用时,Spring 会记住它的某个地方,并且可以填写参数。
要使这项工作正常进行,您只需确保在此之前未请求该 bean。
现在您可能必须先创建需要 BeanThing
的 bean。然后解决方案是注入一个 Provider<BeanThing>
并确保提供者仅在 ServletContext
存在之后使用(即不在 @PostConstruct
或类似的)。