我的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());
}
答案 0 :(得分:1)
如果您使用功能样式而不是注释,则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节