我的 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/