繁体   English   中英

在HandlerIntercaptor中访问请求范围的bean

[英]accessing a request-scoped bean in HandlerIntercaptor

我对Spring和Web开发总体而言还是个新手,所以如果这个问题看起来很困惑或不完整,请多多包涵...

我目前正在开发一个Spring项目,该项目中有一个我称为“ requestContext”的bean,其中包含一些常用数据。 该bean是请求范围的,并且似乎由Servetlet过滤器(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中正确注册?)再次,请原谅我在春季的知识不足,我仍然对IoC之类的东西还不了解...

好吧,看来ElderMael遇到了什么,我的问题最终被以下问题回答: Spring HandlerInterceptors是如何实例化的?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM