我在基于 Spring MVC servlet 的应用程序(非反应式)中使用 WebClient 来通过 HTTP 从其他微服务访问资源。很少有资源受 client_credentials OAuth2 流保护。使用 OAuth2 客户端凭据配置 RestTemplate 非常方便,但现在我无法使用 WebClient 进行相同的配置。我总是可以手动获取 Bearer 令牌,然后在 WebCLientsetBearerAuth()
方法中设置它,但这需要大量的手动管道。我的问题是 - 在 Spring MVC 应用程序中使用时,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 而不是预定的作业,事情会正常工作。对此的任何帮助将不胜感激。