Spring应用程序事件监听器会导致OAuth2RestTemplate请求发生错误

时间:2018-08-16 09:59:01

标签: java spring spring-boot oauth-2.0 kotlin

我有基于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方法中。

0 个答案:

没有答案