当前位置: 首页 > 知识库问答 >
问题:

在实际web请求之外使用请求范围的bean

易阳云
2023-03-14

我有一个web应用程序,它有一个Spring集成逻辑,在一个单独的线程中运行。问题是,在某个时候,我的Spring集成逻辑尝试使用请求范围的bean,然后我得到以下错误:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scopedTarget.tenantContext': Scope 'request' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is 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.


Caused by: 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.

我有ContextLoaderListener设置:

<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

我的作用域Bean是这样注释的(因为我听说代理我的Bean会有帮助):

@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)  
public class TenantContext  implements Serializable {

我所做的可能吗?如果是,我在这里遗漏了什么?如果没有,关于我如何实现这一目标,还有其他建议吗?

共有3个答案

田英卓
2023-03-14

使用属性threadContextInheritable设置为true的RequestContextFilter。这使得子线程继承父线程的上下文,该上下文包含请求对象本身。还要确保执行器不会重用池中的线程,因为请求对象非常特定于该请求,并且不能在各种请求之间共享。SimpleAsyncTaskExecutor就是这样一个执行者。

有关更多信息,请参阅当前线程的作用域“会话”未处于活动状态;IllegalStateException:未找到线程绑定请求。

程禄
2023-03-14

您只能在运行请求的web容器线程上使用请求(和会话)范围的bean。

我假设线程正在等待来自SI流的异步回复?

如果是这样,您可以将请求范围的bean绑定到消息,可能是在头中,或者在负载的某个地方。

乐正晟
2023-03-14
public class WebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] { RootConfiguration.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] { WebMvcConfiguration.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }

    @Override
    protected Filter[] getServletFilters() {
        return new Filter[] { new HiddenHttpMethodFilter() };
    }

    **@Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        super.onStartup(servletContext);
        servletContext.addListener(new RequestContextListener());
    }**
}
 类似资料:
  • 无论 Struts2 还是 Spring,都提供了一种控制器: 每次请求,创建实例,使用后即抛弃。 这样的控制器的好处就是可以放心的吧 request 和 response 对象放心的存成它的私有 属性,反正使用一次后就丢掉了。 在 Nutz.Mvc,所谓控制器,实际上就是 Module,默认的,所有的模块都是整个应用程序唯一的, 除非你在 Ioc 配置文件里另有说明。 那么 Nutz 可以做到每

  • 更改TestResource 并向QueryFactory添加 我理解使用请求范围需要。然而,当我运行它时,我得到一个异常,它告诉我 我看不出哪里出了问题。你能给我指出这个配置应该如何正确地完成吗?

  • 我想在我的web应用程序中使用Spring事件与我的bean“说话”。 例如,fired事件的bean如下所示: 所以,我的问题是: 事件侦听器是作用域请求是否可能?而如何做到这一点呢? 谢谢

  • 这篇文章将会演示如何使用python进行web请求,这里需要几个python的模块来使得我们能够更容易创建和解析web请求与响应(httplib,Mechanize,Beautiful Soup和urllib/urllib2),安装这些模块并且检查这些功能函数. 创建一个Web请求 下面有个简短的例子,展示了使用python的SimpleHTTPServer创建一个本地web服务器,并且建立一个请

  • 问题内容: 场景:我们有一个在Websphere中运行的Spring托管的Web应用程序。(Spring 3.0.x,WAS 7)Webapp通过Spring的Web应用程序利用Websphere的工作管理器(配置为10的线程池)以执行计算密集型db读取操作。因此,基本上,有一个请求来生成10个不同的文件。要生成文档,只需db读取即可收集/处理数据。因此,我们基本上产生了10个线程来处理10个文档

  • 我使用spring指南中简单REST服务的纯示例代码作为基础:http://spring.io/guides/gs/rest-service/ 我添加了单个Bean配置: 然后,我修改后的控制器如下所示: 而我正在得到 由于呼叫“/问候” 我在这里读了一些描述:http://docs.spring.io/spring/docs/current/spring-framework-reference/