Как заставить сервисный слой возвращать ошибку Mono ::, когда он ничего не получает из базы данных - PullRequest
1 голос
/ 22 апреля 2019

Я использую этот блок кода для извлечения некоторых данных из Couchbase, но когда он не может извлечь что-либо, он не вызывает блок onErrorResume.Есть ли способ заставить этот код вызывать onErrorResume, когда не удается найти документ, соответствующий ключу?

return referenceService.getReferenceTable(referenceKey)
    .flatMap(referenceTable -> {
        logger.info("reference table: {}", referenceTable.toString());
        Market market = getMarket(aggregate.getDate(), aggregate.getMarket(), referenceTable);
        aggregate.setMarket(market);
        return Mono.just(aggregate);
    })
    .onErrorResume(e -> {
        logger.info("Error getting reference table");
        return Mono.error(e);
    });

Используемый слой службы выглядит следующим образом:

@Service("referenceService")
public class CouchbaseReferenceService implements ReferenceService {

    @Autowired
    private ReferenceRepository referenceRepository;

    @Override
    public Mono<ReferenceTable> getReferenceTable(String key) {
        return referenceRepository.getReferenceTable(key);
    }

}

1 Ответ

5 голосов
/ 23 апреля 2019

referenceRepository.getReferenceTable(key) возвращает пустое значение Mono, когда ReferenceTable с заданным значением key не найдено.

Это не является ошибкой с точки зрения хранилища.Чтобы обработать пустой Mono как состояние ошибки, вы можете использовать .switchIfEmpty(Mono.error(...)) в своем потоке.

Вот ваш пример с применением .switchIfEmpty:

return referenceService.getReferenceTable(referenceKey)
    .switchIfEmpty(Mono.error(() -> new RuntimeException("No reference table found with key " + referenceKey)))
    .map(referenceTable -> {
        logger.info("reference table: {}", referenceTable.toString());
        Market market = getMarket(aggregate.getDate(), aggregate.getMarket(), referenceTable);
        aggregate.setMarket(market);
        return aggregate;
    })
    .doOnError(e -> logger.info("Error getting reference table", e));

Кроме того, я сделал два других изменения в вашем примере:

  1. Поскольку ваша реализация .flatMap была синхронным отображением 1-к-1, вы можете использовать .map вместо этого, как я сделалсделано выше.
  2. Поскольку ваша реализация .onErrorResume вернула то же исключение, которое наблюдалось, вы можете использовать .doOnError, как я делал выше, что позволяет распространяться исходному исключению.
...