Весенний webflux - мульти Mono - PullRequest
0 голосов
/ 07 июня 2018

Я не знаю и не задаю этот вопрос, кроме как здесь, если это не то место, где я прошу прощения.

В настоящее время я работаю над приложением, использующим Spring WebFlux, и у меня возникла проблема с использованием Mono и Flux..

Здесь у меня есть запрос REST, который поставляется с простым компонентом, который содержит атрибуты, включая список.Этот список повторяется для использования адаптивного вызова монго, который возвращает Mono (findOne).Но я не думаю, что нашел правильный способ сделать это:

@PostMapping
@RequestMapping("/check")
public Mono<ContactCheckResponse> check(@RequestBody List<ContactCheckRequest> list) {
    final ContactCheckResponse response = new ContactCheckResponse();
    response.setRsnCode("00");
    response.setRspnCode("0000");
    LOG.debug("o--> person - check {} items", list.size());

    final List<ContactCheckResponse.Contact> contacts = new ArrayList<>();
    response.setContacts(contacts);

    return Mono.fromCallable(() -> {
        list.stream().forEach( c -> {
            Boolean exists = contactRespository.findOneByThumbprint(c.getIdentifiant()).block() != null;
            ContactCheckResponse.Contact responseContact = new ContactCheckResponse.Contact();
            responseContact.setExist(exists);
            responseContact.setIdentifiant(c.getIdentifiant());
            responseContact.setRsnCode("00");
            responseContact.setRspnCode("0000");
            response.getContacts().add(responseContact);
        });
        return response;
    });
}

факт создания блока не кажется мне в идее "реактивным", но я не нашел, какпоступить иначе.

Может ли кто-нибудь помочь мне найти лучший способ выполнить эту задачу?

Спасибо

1 Ответ

0 голосов
/ 07 июня 2018

Что-то вроде этого:

return Flux.fromIterable(list)
  .flatMap(c -> contactRespository.findOneByThumbprint(c.getIdentifiant())
                  .map(r -> r != null)
                  .map(exists -> {
                         ContactCheckResponse.Contact responseContact = new ContactCheckResponse.Contact();
                         ...
                         return responseContact;
                      })
          )
 .reduce(response, (r,c) -> {
                               response.getContacts().add(responseContact);
                               return response;
         });       

Создайте Flux из списка, создайте контакт для каждой записи и уменьшите все до Mono.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...