WebClient делаю сам

Я следую этому уроку здесь: 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");
  }
}

Большое спасибо за помощь.

Что ж, если в самом ресурсе ничего четко не упоминается, то вам не следует использовать этот ресурс. Или попросите автора добавить больше деталей.

kiner_shah 11.04.2023 13:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хотя вы можете объявить 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/…

surianto 12.04.2023 11:26

Другие вопросы по теме