У меня есть конечная точка, которая должна получить документ excel с использованием класса ExcelUtility, который ожидает Java.Util.List.
Я использую Mongodb для получения данных, но Mongodb возвращает Flux myList.
Как я могу «дать» классу ExcelUtility список myList для создания класса Workbook, который я могу вернуть в ResponseEntity?
Пока у меня есть этот код:
final Workbook myWorkBook = ExcelUtils
.pojo2xlsx(this.myMongoRepository.findAll()
.toStream().collect(Collectors.toList()),
MyType.class);
Метод myMongoRepository.findAll возвращает Flux <MyType>. Это стандартный интерфейс ReactiveMongoRepository.
Я предполагаю, что проблема сводится к тому, что мне нужно «заблокировать» поток, чтобы получить список, чтобы моя пользовательская служба Excel могла принимать обычный список. Я могу сделать это в тестовом коде, но при работе в Web Reactive Framework блокировка, похоже, не разрешена.




Предполагая, что вы вызываете это из реактивного контекста, который вы хотите
Mono<Workbook> wb = s.collectList().map(l -> ExcelUtils.pojo2xlsx(l));
В этом сценарии вы не хотите начинать работу самостоятельно или вызывать блокировку в потоках, управляемых реактивным планировщиком. Вы бы просто вернули этот новый Mono во фреймворк и позволили ему решать, когда и как планировать работу.
Однако, если вы вызываете это из обычного метода, который должен вернуть книгу, у вас нет другого выбора, кроме как заблокировать, но ожидание этого синхронного метода состоит в том, что вы все равно начнете работу и заблокируете ее до ее завершения.
@ArmandoPerea map можно использовать для преобразования синхронного Mono. Mono<ResponseEntity<Workbook>> wb = s.collectList().map(l -> new ResponseEntity<Workbook>(ExcelUtils.pojo2xlsx(l), HttpStatus.OK));
Спасибо, вроде почти. Как преобразовать Mono <Workbook> wb в «Mono<ResponseEntity <?>>». Предполагается, что это вызов веб-службы.