【发布时间】:2020-09-15 14:15:00
【问题描述】:
在 Spring 4 中卡住了这个东西,可能在 5 中也是如此。
那么,我有什么:
- Spring Boot 1.5 网络应用程序
- 请求范围 bean:
@RequestScope
@Component
public class APIAction { ... }
- 从与 webrequest 相关或不相关的线程访问此组件的代码:
private final ObjectProvider<APIAction> apiAction;
apiAction.getIfAvailable()...
- 当它在绑定到 Web 请求的线程中运行时,一切都很好。但是当我从守护线程调用它时,我希望得到
null、异常或其他东西。相反,我收到了一些无法测试 null 或任何表明 bean 确实可用的状态的代理对象。如果我尝试调用任何 bean 方法,我最终会得到异常,说访问绑定到 Web 请求的线程之外的 bean。
所以问题是,我用错了吗?现在,我正在通过调用 RequestContextHolder.getRequestAttributes() != null 在访问 bean 之前检查请求范围,这真的很难看,我需要一直告诉人们为什么他们应该这样使用它。
还有一个额外的问题,实际上是否可以在没有请求绑定的线程中实例化该 bean?
【问题讨论】:
-
我有点困惑,你是说“我在通过调用这个来访问 bean 之前检查请求范围:RequestContextHolder.getRequestAttributes() != null”是在你的守护线程中吗?如果是这样,您是否依赖于请求不会为空的随机机会(当用户发出请求时)并且在同一点您的守护线程将启动?
-
这不是随机的情况。我正在尝试为计划的作业和休息控制器重用一些代码。所以对于rest api,我有请求范围的bean,它在处理请求期间持有一些缓存。我正在寻找一种方法来简化当前代码而无需一直检查 (RequestContextHolder.getRequestAttributes() != null)
标签: java spring spring-boot