Java 使用Spring RequestContextHolder时出现IllegalStateException
我正在过滤器中使用RequestContextHolder记录一段数据,并希望稍后在POJO(通过Spring连接)中访问它。我得到一个例外,这表明我在这里做错了什么,如果您能给我一些指导,我将不胜感激 筛选代码(在doFilter()方法中,其日志记录确认正在调用它): POJO代码:Java 使用Spring RequestContextHolder时出现IllegalStateException,java,spring,tomcat,Java,Spring,Tomcat,我正在过滤器中使用RequestContextHolder记录一段数据,并希望稍后在POJO(通过Spring连接)中访问它。我得到一个例外,这表明我在这里做错了什么,如果您能给我一些指导,我将不胜感激 筛选代码(在doFilter()方法中,其日志记录确认正在调用它): POJO代码: RequestAttributes attrs = RequestContextHolder.getRequestAttributes(); if (attrs != null && attrs
RequestAttributes attrs = RequestContextHolder.getRequestAttributes();
if (attrs != null && attrs.getAttribute("my_attr", RequestAttributes.SCOPE_REQUEST) != null)
{
String myAttr = (String) attrs.getAttribute("my_attr", RequestAttributes.SCOPE_REQUEST);
logger.debug("Got it: ", myAttr);
}
不过,我看到Tomcat出现了这个例外:
java.lang.IllegalStateException: The request object has been recycled and is no longer associated with this facade
at org.apache.catalina.connector.RequestFacade.getAttribute(RequestFacade.java:259)
at org.springframework.web.context.request.ServletRequestAttributes.getAttribute(ServletRequestAttributes.java:98)
at com.mycompany.MyClass(MyClass.java:50)
我确实想知道,在过滤器中使用“设置数据”和通过请求的实际工作使用“获取数据”是否可以在这里发挥作用,但我不确定如何最好地适应这一点,如果它是相关的话?错误可能是因为您让Spring维护一个不再有效的请求对象的线程本地句柄。细节可能没那么重要,因为有不同的方法 以下选项之一将负责正确自动设置和清除线程本地状态:
DispatcherServlet
、RequestContextListener
或RequestContextFilter
。你需要找出哪一个对你的应用程序如何使用Spring最有意义。过滤器和POJO代码不需要直接使用类,如RequestContextHolder
。应该做的是为要访问的属性声明一个代理的、请求范围的bean:
<bean id="myAttr" scope="request">
<aop:scoped-proxy/>
</bean>
Spring应该负责所有细节…错误可能是因为您让Spring维护一个不再有效的请求对象的线程本地句柄。细节可能没那么重要,因为有不同的方法
以下选项之一将负责正确自动设置和清除线程本地状态:DispatcherServlet
、RequestContextListener
或RequestContextFilter
。你需要找出哪一个对你的应用程序如何使用Spring最有意义。过滤器和POJO代码不需要直接使用类,如RequestContextHolder
。应该做的是为要访问的属性声明一个代理的、请求范围的bean:
<bean id="myAttr" scope="request">
<aop:scoped-proxy/>
</bean>
春天应该照顾好所有的细节…嘿;找不到实际对我有效的配置组合。我怀疑你的答案是非常正确的,但我现在只想看看其他的选择,不想再花更多的时间。谢谢嘿找不到实际对我有效的配置组合。我怀疑你的答案是非常正确的,但我现在只想看看其他的选择,不想再花更多的时间。谢谢
<bean id="myPojo">
<property name="myAttr" ref="myAttr"/>
</bean>