Я следую этому уроку здесь: https://www.baeldung.com/spring-webclient-oauth2 Я пытаюсь создать класс обслуживания для доступа к ресурсу из другого API с заданным clientId и clientSecret (проверено в Postman & Swagger).
Next, we'll set the webClient instance that we autowired in our scheduled task:
@Bean
WebClient webClient(ReactiveClientRegistrationRepository clientRegistrations) {
ServerOAuth2AuthorizedClientExchangeFilterFunction oauth =
new ServerOAuth2AuthorizedClientExchangeFilterFunction(
clientRegistrations,
new UnAuthenticatedServerOAuth2AuthorizedClientRepository());
oauth.setDefaultClientRegistrationId("otherClientId");
return WebClient.builder()
.filter(oauth)
.build();
}
Я немного запутался и думаю, куда мне поместить этот код? должен ли я поместить его в класс WebClient.java в пакете конфигурации моего проекта?
я попытался поместить этот код в свой класс обслуживания, и я получаю это сообщение об ошибке:
nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException:
Error creating bean with name 'xxxService': Requested bean is currently in creation:
Is there an unresolvable circular reference?
код в моем классе xxxService выглядит так:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository;
import org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction;
import org.springframework.security.oauth2.client.web.server.UnAuthenticatedServerOAuth2AuthorizedClientRepository;
@Slf4j
@Service
public class xxxService{
@Autowired
private WebClient wclient;
public void getAuthThenGetResource(){
...
log.info("got token");
...
log.info("got response");
}
}
Большое спасибо за помощь.




Хотя вы можете объявить Spring Beans в классе Service, его следует объявить в отдельном классе Configuration. Более того, вы получаете ошибку, потому что вы автоматически связываете компонент с той же службой, в которой он объявлен.
Есть несколько способов исправить это. Один из них использует соглашение об определении класса Configuration, как показано ниже. В идеале этот класс также должен находиться в другом пакете в структуре вашего проекта.
@Configuration
class ApplicationConfiguration {
@Bean
WebClient webClient(ReactiveClientRegistrationRepository clientRegistrations) {
ServerOAuth2AuthorizedClientExchangeFilterFunction oauth =
new ServerOAuth2AuthorizedClientExchangeFilterFunction(
clientRegistrations,
new UnAuthenticatedServerOAuth2AuthorizedClientRepository());
oauth.setDefaultClientRegistrationId("otherClientId");
return WebClient.builder()
.filter(oauth)
.build();
}
}
Другой способ, который я не буду показывать, — это вызов функции объявления bean-компонента (то есть webClient(clientRegistrations)) с ReactiveClientRegistrationRepository, который вы можете использовать Autowire вместо WebClient. Это НЕ правильный способ сделать это. Я просто хотел упомянуть другие способы борьбы с ошибками внедрения зависимостей.
Спасибо Венкатеш. :) я переместил WebClient @Bean в класс конфигурации. Когда я его построил, ошибка, казалось, была решена. Но... появляется новая ошибка: неудовлетворенная зависимость, выраженная через параметр метода 'webClient' 0; Нет подходящего компонента типа ReactiveClientRegistrationRepository. Я отправил вопрос сюда: stackoverflow.com/questions/75993646/…
Что ж, если в самом ресурсе ничего четко не упоминается, то вам не следует использовать этот ресурс. Или попросите автора добавить больше деталей.