Нельзя использовать блочный метод на главном потоке реактора. Это запрещено block
может работать, когда publi sh mono в каком-то другом потоке, но это не так.
В принципе, ваш подход к сжатию двух моно верен. Вы можете создать какой-нибудь вспомогательный метод для расчета. В вашем случае это может выглядеть так:
public boolean isAccountBalanceGreater(Account acc, Product prd) {
return acc.getBalance() >= prd.getPrice();
}
И тогда в вашем моно потоке вы можете передать ссылку на метод и сделать его более читабельным.
Mono<Boolean> result = account.zipWith(productPrice, this::isAccountBalanceGreater)
Вопрос в том, что вы хотите сделать с этой информацией позже. Если вы хотите вернуться к своему контроллеру, просто true
или false
, это нормально. В противном случае вам могут потребоваться некоторые другие сопоставления, zippings и др. c.
Обновление
return account.zipWith(productPrice, this::createResponse);
...
ResponseEntity createResponse(Account acc, Product prd) {
int responseCode = isAccountBalanceGreater(acc, prd) ? 200 : 500;
return ResponseEntity.status(responseCode).body(prd);
}