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

作用域“会话”对于当前线程不是活动的;IllegalStateException:未找到线程绑定请求

房育
2023-03-14

为了在请求、会话和全局会话级别支持bean的范围(Web范围bean),在定义bean之前需要进行一些次要的初始配置

我在web.xml中添加了以下内容,如文档所示:

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

2.将bean限定为依赖项

@Controller
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class ReportBuilder implements Serializable {
    ...
    ...
}

org.springframework.beans.factory.BeanCreationException:创建名为“ScopedTarget.ReportBuilder”的bean时出错:当前线程的作用域“session”不活动;如果您打算从单个对象引用这个bean,请考虑为它定义一个限定作用域的代理;嵌套异常是java.lang.IllegalStateException:没有找到线程绑定请求:您是在实际web请求之外引用请求属性,还是在最初接收线程之外处理请求?如果您实际上在web请求中操作,并且仍然接收到此消息,那么您的代码可能在DispatcherServlet/DispatcherPortlet之外运行:在这种情况下,使用RequestContextListener或RequestContextFilter公开当前请求。

更新1

下面是我的组件扫描。web.xml中有以下内容:

<context-param>
  <param-name>contextClass</param-name>
  <param-value>
    org.springframework.web.context.support.AnnotationConfigWebApplicationContext
  </param-value>
</context-param>

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>org.example.AppConfig</param-value>
</context-param>

<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
@Configuration
@EnableAsync
@EnableCaching
@ComponentScan("org.example")
@ImportResource("classpath:applicationContext.xml")
public class AppConfig implements AsyncConfigurer {
  ...
  ...
}

共有1个答案

公良泰宁
2023-03-14

问题不在于您的Spring注释,而在于您的设计模式。您可以将不同的作用域和线程混合在一起:

  • 单例
  • 会话(或请求)
  • 作业线程池

singleton在任何地方都有,它是可以的。但是,会话/请求范围在附加到请求的线程之外不可用。

即使请求或会话不再存在,异步作业也可以运行,因此不可能使用依赖于请求/会话的bean。另外,如果您在一个单独的线程中运行作业,也无法知道哪个线程是发起请求的线程(这意味着AOP:Proxy在这种情况下没有帮助)。

我认为您的代码看起来像是希望在ReportController、ReportBuilder、UselessTask和ReportPage之间建立一个契约。是否有一种方法可以只使用一个简单的类(POJO)来存储来自UselesTask的数据,并在ReportController或ReportPage中读取数据,而不再使用ReportBuilder?

 类似资料:
  • 问题内容: 我有一个控制器,希望每个会话都唯一。根据spring文档,实现有两个细节: 1.初始Web配置 为了支持在请求,会话和全局会话级别(Web范围的Bean)的Bean范围界定,在定义Bean之前,需要一些较小的初始配置。 web.xml如文档所示,我已经添加了以下内容: 2.范围豆作为依赖项 如果要将(例如)HTTP请求范围的bean注入另一个bean,则必须注入AOP代理来代替范围的b

  • 问题内容: 我在Spring3和Hibernte4中遇到上述异常 以下是我的bean xml文件 我的BaseDAO类看起来像这样 以下代码在标题中引发异常 有谁知道如何解决这个问题? 问题答案: 仅在交易范围内有意义。 您需要声明一个适当的事务管理器,划分事务边界并在其中进行数据访问。例如,如下: 。 也可以看看: 10.交易管理 13.3hibernate

  • 问题内容: 我有一个使用spring和hibernate的java stuts2 Web应用程序。 我越来越。 SpringBean.xml hibernate.cfg.xml CustomerServiceImpl.java CustomerDaoImpl.java CustomerAction.java 我得到的例外 问题答案: 您在Spring配置中指定了一个事务管理器,但是没有关于何时或何

  • 我试图在一个演示的独立应用程序中使用Spring,使用DAO层和服务层来使用委托的Hibernate事务。 我已经正确地设置了配置,并且我已经对DAO方法上使用@Transactional注释进行了单元测试,测试结果表明它可以正常工作,但是当我将这个注释移动到服务层时,我得到了一个: 我提供了代码中最相关的部分,希望您能给我一个提示,让我了解这里发生了什么。 在GenericDaoHibernat

  • 当前线程的作用域“请求”未处于活动状态;如果您想从一个单体引用它,请考虑为这个bean定义一个作用域代理;嵌套的异常是java。lang.IllegalStateException:未找到线程绑定请求:您是指实际web请求之外的请求属性,还是在原始接收线程之外处理请求?如果您实际上在web请求中操作,并且仍然收到此消息,那么您的代码可能在DispatcherServlet/DispatcherPo

  • 我得到以下错误 服务级别 刀类钻头 这个在我application-context.xml 有人能指出为什么我会得到下面的错误吗?