Получить Java.Util.List из Flux в Spring Web Reactive Framework

У меня есть конечная точка, которая должна получить документ 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 блокировка, похоже, не разрешена.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
343
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предполагая, что вы вызываете это из реактивного контекста, который вы хотите

Mono<Workbook> wb = s.collectList().map(l -> ExcelUtils.pojo2xlsx(l));

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

Однако, если вы вызываете это из обычного метода, который должен вернуть книгу, у вас нет другого выбора, кроме как заблокировать, но ожидание этого синхронного метода состоит в том, что вы все равно начнете работу и заблокируете ее до ее завершения.

Спасибо, вроде почти. Как преобразовать Mono <Workbook> wb в «Mono<ResponseEntity <?>>». Предполагается, что это вызов веб-службы.

Armando Perea 25.04.2019 21:00

@ArmandoPerea map можно использовать для преобразования синхронного Mono. Mono<ResponseEntity<Workbook>> wb = s.collectList().map(l -> new ResponseEntity<Workbook>(ExcelUtils.pojo2xlsx(l), HttpStatus.OK));

akreddy.21 26.04.2019 13:02

Другие вопросы по теме