Как преобразовать объект запроса в модель Spring Webflux - PullRequest
0 голосов
/ 05 октября 2018

Мой RestController имеет объект запроса (DTO), и мне нужно преобразовать его в мой объект модели (Документ MongoDB), но как правильно выполнить это преобразование с помощью Spring Webflux, а не с блоком ввода-вывода?

Я подумал кое-что:

Мой DTO как издатель (Mono), а затем я перешел на свою модель и вызвал свой бизнес уровень:

@PostMapping("/persons")
public Mono<ResponseEntity<Void>> save(@RequestBody Mono<PersonRequest> request) {
    return request.map(r -> Person.builder()
                        .id(r.getId())
                        .name(r.getName())
                        .build())
            .flatMap(personService::save)
            .map(p -> ResponseEntity.ok().build());
}

Или мой DTO не нуженбыть издателем?

@PostMapping("/persons")
public Mono<ResponseEntity<Void>> save(@RequestBody PersonRequest request) {
    return personService.save(Person.builder()
                        .id(request.getId())
                        .name(request.getName())
                        .build())
            .map(p -> ResponseEntity.ok().build());
}

1 Ответ

0 голосов
/ 06 октября 2018

Если вы используете функциональный стиль, а не аннотации, то ServerRequest предоставляет такие методы, как bodyToFlux (Person.class), которые можно использовать и которые полностью не блокируют.

Если вы используете стиль аннотации, как показано ниже:

 @PostMapping("/person")
    Mono<Void> create(@RequestBody Publisher<Person> personStream) {
            return this.repository.save(personStream).then();
    }

Это потому, что, как вы сказали, если вы не используете Publisher, преобразование в Person будет блокировать.См. Раздел 2.1.1 на https://docs.spring.io/spring/docs/5.0.0.RC4/spring-framework-reference/reactive-web.html

...