【发布时间】:2021-04-25 09:55:18
【问题描述】:
最近,我知道 RequestScoped bean 不能在 Web 事务之外使用。
问题是在网络事务之外我不想使用那个 bean,而不是出错。
我怎样才能做到这一点?
使用请求范围 bean 的组件:
@Component
public class JavaComponent {
@Autowired
private RequestScopedBean requestScopedBean;
@Override
public void doStuff() {
// TODO if in web transaction, use RequestScopedBean , otherwhise don't
}
}
豆子:
@Component
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class RequestScopedBean {
public String getInfo() {
return "information about the web transaction";
}
}
编辑:尝试在 Web 请求之外使用 JavaComponent 时遇到的错误是:
org.springframework.beans.factory.BeanCreationException: 错误 创建名为“JavaComponent.requestScopedBean”的bean:范围 'request' 对当前线程无效;考虑定义一个 如果您打算从 单身人士;嵌套异常是 java.lang.IllegalStateException: No 找到线程绑定请求:您指的是请求属性吗 在实际 Web 请求之外,或在 最初的接收线程?如果您实际上是在 一个网络请求,仍然收到此消息,您的代码可能是 在 DispatcherServlet/DispatcherPortlet 之外运行:在这种情况下, 使用 RequestContextListener 或 RequestContextFilter 来公开 当前请求。
我在 Web 请求线程之外使用 bean 的方式是让 @Async 方法在单独的线程中运行。
【问题讨论】:
-
您遇到什么错误?另外,在 Web 请求的上下文之外使用
JavaComponent的用例是什么? -
我已经用你的问题的答案编辑了这个问题。谢谢
-
不,我不想在异步请求中使用请求范围的 bean,我只想在 Web 请求之外时不要使用它。
-
我明白这一点。使用
proxyMode(如答案之一所示)将防止错误。这意味着您现在可以正确初始化 bean。至于异步请求,您应该能够在运行时处理丢失的请求范围
标签: java spring spring-boot dependency-injection