【问题标题】:accessing a request-scoped bean in HandlerIntercaptor在 HandlerInterceptor 中访问请求范围的 bean
【发布时间】: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


【解决方案1】:

嗯,ElderMael 似乎在做某事,我的问题最终得到了这个问题的回答:How are Spring HandlerInterceptors instantiated?

在没有定义拦截器的范围和它使用的 bean 的情况下,它们是单例的,它们是使用 requestContext 的一个实例创建的。当为每个请求创建后续实例时,我仍然拥有旧的原始实例。我相信添加 processInjectionBasedOnCurrentContext 方法只是再次处理自动装配,并找到新创建的实例。我将不得不考虑解决这个问题的理想方法,但我认为因为 HandlerInterceptor 不需要保留状态,我可能也可以将它和相关的 bean 设置为请求范围。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 2013-01-21
    • 2011-11-11
    • 2011-04-19
    相关资源
    最近更新 更多