Реактор 3 - Как вернуть Flux на Mono Error? - PullRequest
0 голосов
/ 30 августа 2018

Вот примерный код: я хочу сделать что-то вроде этого -

public Flux<Object2> getSomething(String email) {
    method1(email).map(result -> {  //method1 returns Mono<Object1>
        if(result.id().isEmpty()) {
            return method2(email); //method2 returns Flux<Object2>
        } else {
            return Flux.empty();
        }
    };
});

Итак, когда method1 возвращает пустой Object1.id (), тогда вызывается только method2. В противном случае верните пустой поток.

Указатели для заметки -

  1. Не доходит до вызова второго метода

  2. Поскольку один метод - Mono, а другой - Flux, существует несоответствие типов, если я напрямую добавляю return в строку 2.

  3. Я пытался с этим в method1:

    if(Object1.id().isEmpty()){
    
       throw new IllegalArgumentException;
    }
    

и в приведенном выше фрагменте кода:

try {
    method1(email);
} catch(IllegalArgumentException e) {
    return method2(email);
}

Здесь никогда не ловится исключение.

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Вы должны использовать оператор switchIfEmpty ().

Кроме того, если вы хотите вернуть оба типа (Mono и Flux) из метода, измените тип возвращаемого значения на org.reactiveStreams.Publisher. Я не буду рекомендовать это все же.

Скорее вернуть Flux Даже если есть только 1 данные для возврата, они все равно могут быть возвращены как Flux. Преобразуйте Mono во Flux и, если он пуст, пользовательский оператор switchIfEmpty для отправки другого потока Flux.

0 голосов
/ 30 августа 2018

Ваш первый фрагмент кода не должен компилироваться, так как реализация метода ничего не перенастраивает, поэтому я попытаюсь угадать, что происходит.

Здесь ничего не происходит, поскольку созданный вами издатель не возвращается методом. Если ничто не подписывается на этот поток / моно, ничего не происходит .

public Flux<Object2> getSomething(String email) {
    return method1(email)
              .filter(result -> result.id().isEmpty())
              .flatMapMany(result -> method2(email));
}

Тогда вы можете использовать filter, чтобы отфильтровать результат и ничего не выдавать из этого Mono, если предикат не встречается. Кроме того, flatMapMany поможет вам превратить результат в ожидаемый тип возвращаемого значения.

...