java - 在 HandlerInterceptor 中访问请求范围的 bean

标签 java spring-mvc servlets servlet-filters spring-bean

总的来说,我对 Spring 和 Web 开发非常陌生,所以如果问题看起来很困惑或不完整,请耐心等待......

我目前正在开发一个 Spring 项目,其中有一个我称之为“requestContext”的 bean,它保存一些常用的数据。该 bean 是请求范围的,并且它似乎由一个servlet 过滤器(GenericFilterBean 的子级)填充。

我试图在 HandlerInterceptor 的 preHandle 方法中从另一个 bean(我将称为 UserBean)访问此 bean 所保存的信息。在 UserBean 中,我使用 @AutoWired 来访问 bean,如下所示:

@Autowired
private RequestContext requestContext;

然后,在 UserBeans 方法之一中,我尝试访问必要的数据。问题在于请求上下文包含所有空值。我认为可能存在一些生命周期问题,因为不熟悉过滤器,但是使用一些断点,我可以看到过滤器在 handlerInterceptor 之前执行,并且我可以看到正在设置的请求上下文数据。既然如此,我希望至少能够在拦截器的 preHandle 方法中访问它,如果不是其他方法的话。

应用程序的其余部分(包括过滤器、处理程序拦截器)都是现有/已知的工作代码,因此我认为在我尝试使用该 bean 之前没有任何设置问题。只是我的期望或我尝试访问它的方式存在一些问题。

更新: 我找到了一个实际使用 requestContext 的类的示例。它是另一个过滤器(但直接实现 Filter 而不是扩展 GenericFilterBean)。该过滤器调用

SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this)

在其 init() 方法中。我注意到,如果我在尝试访问 requestContext 之前进行此调用,那么它会使用我期望的值进行实例化(另请注意,如果我在默认构造函数中执行此操作,它将不起作用)。有件事告诉我,这不是我的案例中的权利解决方案,但希望这能对这个问题有所启发。

尝试阅读 SpringBeanAutowiringSupport 以更好地理解。我认为如果我理解正确的话,这表明我的 bean 当前无法访问 WebApplicationContext,因此默认情况下 Autowiring 在进行此调用之前不会工作(一旦进行调用,后续请求似乎不需要它)。这是否表明我配置bean的方式存在一些问题(它没有正确注册到IoC?)再次,请原谅我对spring的缺乏了解,我仍然不太了解像IoC这样的东西......

最佳答案

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

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

关于java - 在 HandlerInterceptor 中访问请求范围的 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26152018/

相关文章:

java - JSTL 使用 scriptlet

java - 如何检查java中的int范围并将其限制为仅5位数字

java - Spring MVC。关于愿景解决方案/设计问题的问题

spring - Spring 4 中的@PathVariable 验证

java - 在 Tomcat 中检索文件时出现问题

java - 登录后重定向回页面

java - 在java中显示新行中的名称数量

java - 从 Apache exec commons 获取并解析输出流

java - 使用 ByteBuffer 将 long 转换为 "unsigned, 4 byte integer in network byte order"

java - Spring MVC : create email notification service