【发布时间】:2014-11-26 22:08:20
【问题描述】:
我对 Spring 和 Web 开发很陌生,所以如果问题看起来很困惑或不完整,请多多包涵...
我目前正在开发一个 Spring 项目,其中有一个我称之为“requestContext”的 bean,它包含一些常用数据。此 bean 是请求范围的,并且它似乎由一个 serverlet 过滤器(GenericFilterBean 的一个子级)填充。
我正在尝试从 HandlerInterceptor 的 preHandle 方法中的另一个 bean(我将调用 UserBean)访问此 bean 持有的信息。在 UserBean 中,我使用 @AutoWired 访问 bean,如下所示:
@Autowired
private RequestContext requestContext;
然后在 UserBeans 方法之一中,我尝试访问必要的数据。问题是请求上下文包含所有空值。我认为可能存在一些生命周期问题,对过滤器不熟悉,但是使用一些断点我可以看到过滤器在 handlerInterceptor 之前执行,并且我可以看到正在设置的请求上下文数据。在这种情况下,如果不是其他方法,我希望至少能够在拦截器的 preHandle 方法中访问它。
应用程序的其余部分(包括过滤器、处理程序拦截器)都是现有/已知的工作代码,所以我认为在尝试使用该 bean 之前我没有任何设置问题。只是我的期望或我尝试访问它的方式存在一些问题。
更新: 我发现了一个实际使用 requestContext 的类的示例。这是另一个过滤器(但直接实现过滤器而不是扩展 GenericFilterBean)。这个过滤器调用
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this)
在它的 init() 方法中。我注意到,如果我在尝试访问 requestContext 之前进行此调用,那么它将使用我期望的值进行实例化(还请注意,如果我在默认构造函数中执行此操作,它将不起作用)。有些事情告诉我,这不是我的情况的权利解决方案,但希望这能对这个问题有所了解。
尝试阅读 SpringBeanAutowiringSupport 以更好地理解。我认为如果我理解正确,这表明我的 bean 当前无法访问 WebApplicationContext,因此在进行此调用之前自动装配默认不工作(一旦调用,随后的请求似乎不需要它)。这是否表明我配置 bean 的方式存在一些问题(它没有在 IoC 中正确注册?)再次,请原谅我对 spring 缺乏了解,我仍然不太了解 IoC 之类的东西......
【问题讨论】:
-
注入 RequestContext 的 bean 的范围是什么?
-
我没有在那个 bean 上明确设置范围。如果它有用,这个 bean 将作为构造函数 arg 注入到配置文件中的处理程序拦截器的 bean。我也刚刚意识到在尝试访问 requestContext 之前在方法中调用“SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this)”可以解决问题,并且创建的 bean 填充了预期的值。由于我能想到的几个原因,这似乎不是正确的解决方案,但也许这对我的问题有所启发?
标签: java spring-mvc servlets servlet-filters spring-bean