Получение NoSuchBeanDefinitionException: нет подходящего компонента типа ServerRequest в Spring WebFlux - PullRequest
0 голосов
/ 20 апреля 2020

Из-за того, что я до сих пор не нашел полностью удовлетворительное и реактивное решение для моего topi c: click , основным предположением которого было:

How to run a Web Flux method cyclically in a reactive way?

Я нашел обходной путь, чтобы сделать это реальным, используя аннотацию @Scheduled. Реализация ниже:

@Component
@AllArgsConstructor
public class Covid19APIHandler {

  private Covid19APIService apiService;

  private CountryCasesHistoryRepository repository;

  private CountryCasesWrapperRepository countryCasesWrapperRepository;

  private ServerRequest serverRequest;

  public Mono<Void> getCountryCasesAndSave(ServerRequest serverRequest) {
    return apiService
        .findCasesByCountry()
        .flatMap(
            wrapper ->
                countryCasesWrapperRepository
                    .save(
                        CountryCasesWrapper.builder()
                            .countries_stat(wrapper.getCountries_stat())
                            .statistic_taken_at(wrapper.getStatistic_taken_at())
                            .build())
                    .then(Mono.empty()));
  }

  @Scheduled(fixedDelay = 10000)
  public void casesByCountryScheduled() {
    getCountryCasesAndSave(serverRequest);
  }
}

Проблема в том, что при выполнении кода я получаю сообщение об ошибке:

Description:

Parameter 3 of constructor in com.covid.application.Covid19APIHandler required a bean of type 'org.springframework.web.reactive.function.server.ServerRequest' that could not be found.

Action:

Consider defining a bean of type 'org.springframework.web.reactive.function.server.ServerRequest' in your configuration.

Я пробовал ключевое слово final с @RequiredArgsConstructor, генерируя все аргументы. конструктор через IntelliJ, но мое поле ServerRequest не инициализировано. Здесь возникает вопрос, как создать мой пользовательский компонент ServerRequest и правильно его инициализировать. Буду благодарен за предложения о том, как это сделать.

1 Ответ

1 голос
/ 20 апреля 2020

Как указано в комментариях, зачем вам вообще нужен ServerRequest, вы даже не используете его. Удалите его и очистите код.

@Component
public class Covid19APIHandler {

    private Covid19APIService apiService;
    private CountryCasesWrapperRepository countryCasesWrapperRepository;

    @Autowire
    public Covid19APIHandler(Covid19APIService apiService, CountryCasesHistoryRepository repository) {
        this.apiService = apiService;
        this.repository = repository;
    }

    @Scheduled(fixedDelay = 10000)
    public void casesByCountryScheduled() {
        apiService.findCasesByCountry()
            .flatMap(response ->
                return countryCasesWrapperRepository.save(
                    CountryCasesWrapper.builder()
                        .countries_stat(response.getCountries_stat())
                        .statistic_taken_at(response.getStatistic_taken_at())
                        .build()))
        .subscribe();
    }
}

В этом коде запланированное задание будет выполняться в соответствии с fixedDelay, если вы хотите, чтобы оно выполнялось каждый час, я рекомендую установить задание cron в планировщик.

Код будет работать из-за subscribe. Вы видите, когда вы звоните subscribe, вы в основном запускаете код. consumer всегда должен быть subscriber. Ваше приложение является consumer другого приложения. Таким образом, ваша служба инициирует запрос, вызывая подписку, и это запустит процесс создания запроса и его сохранения в вашей базе данных.

Я предлагаю прочитать следующую задачу

cron с @Scheduled

https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/scheduling.html#scheduling аннотирование-поддержка-запланировано

Cron синтаксис

https://en.wikipedia.org/wiki/Cron

Ничего не произойдет, пока вы не подпишитесь (документация по реактору)

https://projectreactor.io/docs/core/release/reference/#reactive .subscribe

...