从Spring Boot 1.2.8升级到1.3.1会导致在Glassfish中注入HttpServletRequest时调用方法时找不到线程绑定请求

时间:2015-12-23 11:31:30

标签: spring spring-boot glassfish

我们的Spring Boot Web应用程序在GlassFish 3.1.2,Spring Boot 1.2.8上运行良好。

自升级到Spring Boot 1.3.1以来,它不再有效,特别是在将HttpServletRequest注入类似Web过滤器(例如OncePerRequestFilter的子类)的情况下,当您调用许多时,您会收到“未找到线程请求”请求上的方法(例如getAttributes)。

java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
at org.springframework.web.context.request.RequestContextHolder.currentRequestAttributes(RequestContextHolder.java:131)
at org.springframework.web.context.support.WebApplicationContextUtils.currentRequestAttributes(WebApplicationContextUtils.java:309)
at org.springframework.web.context.support.WebApplicationContextUtils.access$400(WebApplicationContextUtils.java:64)
at org.springframework.web.context.support.WebApplicationContextUtils$RequestObjectFactory.getObject(WebApplicationContextUtils.java:325)
at org.springframework.web.context.support.WebApplicationContextUtils$RequestObjectFactory.getObject(WebApplicationContextUtils.java:320)
at org.springframework.beans.factory.support.AutowireUtils$ObjectFactoryDelegatingInvocationHandler.invoke(AutowireUtils.java:307)

2 个答案:

答案 0 :(得分:1)

过滤器是单例,而HttpServletRequests是请求范围。当您收到错误时,您应该在处理另一个请求时获取一个请求的属性。应该在1.3.1中加强一些检查以避免这种情况。

通常,混合bean生命周期是一个坏主意。因此,人们遇到了问题(即herehere)。

您可以检查method injection以处理不同生命周期的bean的协作。

答案 1 :(得分:0)

事实证明,Glassfish 3.3按照与添加FilterRegistrationBeans时指定的顺序相反的顺序处理过滤器

因此,如果您正在使用嵌入式上下文,请在RequestContextFilter命令-105之前(更高编号)添加过滤器,如果您正在运行Glassfish,请在RequestContextFilter之后(较低编号)添加它们。

不确定这是否是Glassfish 3.3的特点,但这就是问题所在。