我有基于Spring Boot的微服务。 我正在尝试在应用程序启动后立即发出请求,因此我在处理该事件的方法中使用了ApplicationReadyEvent,而我正在使用oAuth2RestTemplate调用另一个微服务,并且出现以下错误:
创建名称为“ scopedTarget.oauth2ClientContext”的bean时出错: 范围“请求”对于当前线程无效。考虑 如果要引用它,则为此bean定义作用域代理 从单身嵌套的异常是java.lang.IllegalStateException: 找不到线程绑定的请求:您是否在引用请求属性 在实际的Web请求之外,或在外部处理请求 最初的接收线程?如果您实际在 一个网络请求,但仍然收到此消息,您的代码可能是 在DispatcherServlet / DispatcherPortlet外部运行:在这种情况下, 使用RequestContextListener或RequestContextFilter公开 当前请求。
我的Kotlin侦听器类:
@Component
class ApplicationStartupListener(
private val deviceService: DeviceService,
private val taskService: TaskService) {
@EventListener
fun handle(event: ApplicationReadyEvent) {
val tasks = taskService.listAllWhereDeviceSnapshotIsNull()
val deviceIds = tasks.map { it.deviceId }
val devices = deviceService.findAll()
}
}
deviceService#findAll()是一个客户端方法,它请求调用另一个微服务。 该客户端具有以下构造函数
@Service
class DeviceClientService(
@Qualifier("oAuthRestTemplate")
override val restTemplate: RestTemplate,
private val addressUtil: AddressUtil
)
使用OAuth2RestTemplate进行呼叫
我的OAuthRestTemplate Bean是通过这种方式定义的
@Bean
fun oAuthRestTemplate(authorizationCodeResourceDetails: AuthorizationCodeResourceDetails,
oauth2ClientContext: OAuth2ClientContext): RestTemplate {
return OAuth2RestTemplate(authorizationCodeResourceDetails, oauth2ClientContext);
}
也可以从项目中的其他任何地方调用此服务,但是它可以正常工作。该问题仅出现在此EventListener方法中。