java - 如何将请求对象转换为Spring Webflux模型

标签 java spring spring-webflux project-reactor

我的 RestController 有一个请求对象 (DTO),我需要转换为我的模型对象(MongoDB 文档),但是使用 Spring Webflux 进行此转换而不阻止 I/O 的正确方法是什么?

我想到了一些事情:

我的 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());
}

最佳答案

如果您使用函数式风格而不是注释,那么 ServerRequest 会提供诸如 bodyToFlux(Person.class) 之类的方法,这些方法可以使用并且完全非阻塞。

如果您使用注释样式,如下所示:

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

这是因为,正如您所说,如果您不使用 Publisher,那么到 Person 的转换将会被阻止。 请参阅 https://docs.spring.io/spring/docs/5.0.0.RC4/spring-framework-reference/reactive-web.html 中的第 2.1.1 节

关于java - 如何将请求对象转换为Spring Webflux模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52670252/

相关文章:

java - 如何使用条件注释覆盖 spring 中的配置(例如)

Spring Boot 外部 WAR 在 Apache Tomcat 中运行没有日志

java - Spring Framework名称背景

java - Spring Webflux : Controller return Mono<ResponseEntity<MyPojo>> vs Mono<MyPojo>

java - Spring Webflux : Webclient : Get body on error

java - StreamTokenizer 破坏整数和松散的句点

java - FreeMarker编码困惑

java - 是否可以在不将助焊剂转化为流的情况下从助焊剂中获得第一个元素?

java - 使用 this 在 Node.js 中构建类

java - Java中如何实现采样?