Я использую WebClient в приложении на основе сервлета Spring MVC (нереактивное) для доступа к ресурсам через HTTP из других микросервисов. Некоторые ресурсы защищены потоком client_credentials OAuth2. Настроить RestTemplate с учетными данными клиента OAuth2 очень удобно, но теперь я застрял в настройке того же самого с помощью WebClient. Я всегда могу получить токен Bearer вручную, а затем установить его в методе WebCLient setBearerAuth()
, но для этого потребуется много ручного подключения. Мой вопрос: поддерживает ли WebClient фильтр Exchange для автоматического потока учетных данных клиента при использовании в приложении Spring MVC?
ОБНОВЛЕНИЕ: я обнаружил 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:
Все работает нормально, если я использую этот WebClient из контроллера MVC вместо запланированного задания. Любая помощь по этому поводу будет оценена.