Spring boot 具有WebClient和OAuth客户端凭据的SpringMVCServlet

Spring boot 具有WebClient和OAuth客户端凭据的SpringMVCServlet,spring-boot,spring-webflux,spring-webclient,Spring Boot,Spring Webflux,Spring Webclient,我在SpringMVCServlet应用程序中使用WebClient(非反应式)通过HTTP从其他微服务访问资源。很少有资源受到客户端\u凭证OAuth2流的保护。使用OAuth2客户端凭据配置RestTemplate非常方便,但现在我无法使用WebClient配置相同的凭据。我总是可以手动获取承载令牌,然后在WebCLientsetBearerAuth()方法中设置它,但这需要大量的手动操作。我的问题是-当在SpringMVC应用程序中使用时,WebClient是否支持用于自动客户端凭据流的E

我在SpringMVCServlet应用程序中使用WebClient(非反应式)通过HTTP从其他微服务访问资源。很少有资源受到客户端\u凭证OAuth2流的保护。使用OAuth2客户端凭据配置RestTemplate非常方便,但现在我无法使用WebClient配置相同的凭据。我总是可以手动获取承载令牌,然后在WebCLient
setBearerAuth()
方法中设置它,但这需要大量的手动操作。我的问题是-当在SpringMVC应用程序中使用时,WebClient是否支持用于自动客户端凭据流的Exchange筛选器

更新: 我找到了应解决客户端凭据身份验证流的
ServletOAuth2AuthorizedClientExchangeFilterFunction
。我正在使用以下代码:

@Bean
WebClient webClient(ClientRegistrationRepository clientRegistrations, OAuth2AuthorizedClientRepository authorizedClients) {
    ServletOAuth2AuthorizedClientExchangeFilterFunction oauth2 =
            new ServletOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrations, authorizedClients);
    oauth2.setDefaultClientRegistrationId("cart67");
    oauth2.setDefaultOAuth2AuthorizedClient(true);
    final WebClient webClient = WebClient.builder()
            .apply(oauth2.oauth2Configuration())
            .build();
    return webClient;
}
但现在的问题是,当从计划作业调用此WebClient时,它无法调用远程资源服务器。我得到以下错误:

reactor.core.Exceptions$ErrorCallbackNotImplemented: 
           java.lang.IllegalArgumentException: request cannot be null
Caused by: java.lang.IllegalArgumentException: request cannot be null
at org.springframework.util.Assert.notNull(Assert.java:198)
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:

如果我从MVC控制器而不是计划作业使用此WebClient,一切都会正常工作。如果您对此有任何帮助,我们将不胜感激。

这可能来自
httpsessionauth2authorizationrequestrepository
,它用于将
OAuth2AuthorizationRequest
存储在
HttpSession
中。由于您的应用程序可以很好地处理控制器处理的传入HTTP请求,因此这是有意义的

您可能希望以不同的方式配置您的
OAuth2AuthorizedClient存储库
,并且不将信息存储在
HttpSession

在这里提供了一个很好的开端,可以选择并配置正确的