Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Spring RequestContextHolder时出现IllegalStateException_Java_Spring_Tomcat - Fatal编程技术网

Java 使用Spring RequestContextHolder时出现IllegalStateException

Java 使用Spring RequestContextHolder时出现IllegalStateException,java,spring,tomcat,Java,Spring,Tomcat,我正在过滤器中使用RequestContextHolder记录一段数据,并希望稍后在POJO(通过Spring连接)中访问它。我得到一个例外,这表明我在这里做错了什么,如果您能给我一些指导,我将不胜感激 筛选代码(在doFilter()方法中,其日志记录确认正在调用它): POJO代码: RequestAttributes attrs = RequestContextHolder.getRequestAttributes(); if (attrs != null && attrs

我正在过滤器中使用RequestContextHolder记录一段数据,并希望稍后在POJO(通过Spring连接)中访问它。我得到一个例外,这表明我在这里做错了什么,如果您能给我一些指导,我将不胜感激

筛选代码(在doFilter()方法中,其日志记录确认正在调用它):

POJO代码:

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>