我正在尝试将WebMVC控制器转换为返回Mono<Resource>的WebFlux控制器。
旧的WebMVC控制器如下所示。
@GetMapping("/resources/{id}")
public ResponseEntity<Resource> getCustomer(@RequestParam String id) {
if(id.length != 10) {
// set ResponseEntity status 400 and then return it
}
val resource = resourceService.getResourceById(id);
return ResponseEntity.ok().body(resource);
}如何使if块与Reactive Programming更兼容
发布于 2020-12-26 03:30:19
如果您使用的是函数式端点,您可以这样做。
public Mono<ServerResponse> getCustomer(ServerRequest serverRequest) {
if (serverRequest.pathVariable("id").length() != 10) {
return ServerResponse
.status(400)
.build();
} else {
return ServerResponse
.ok()
.body(
resourceService.getResourceById(serverRequest.pathVariable("id")),
Resource.class
);
}
}上面提到的对我来说更容易读懂。但是,您可以从Mono.just(serverRequest.pathVariable("id"))开始,如果您真的想维护流,即使在方法中也是如此,如下所示。
return Mono.just(serverRequest.pathVariable("id"))
.filter(id -> id.length() == 10)
.flatMap(resourceService::getResourceById)
.flatMap(resource -> ServerResponse
.ok()
.body(
resourceService.getResourceById(serverRequest.pathVariable("id")),
Resource.class
)
)
.switchIfEmpty(ServerResponse.status(400).build());类似地,如果您使用带注释的控制器,下面这样的内容似乎更易读(对我来说:)。
@GetMapping(path = "/resources/{id}")
public ResponseEntity<Mono<Resource>> getCustomer(@PathVariable String id) {
if (id.length() != 10) {
return ResponseEntity
.status(400)
.build();
} else {
return ResponseEntity
.ok()
.body(resourceService
.getResourceById(id));
}
}正式文档是一个很好的参考:文档中的两个相关部分。
发布于 2021-01-12 10:48:24
U需要创建网络流量功能流的处理程序,路由器。
@Component公共类SampleHandlerFunction {
public Mono<ServerResponse> flux(ServerRequest serverRequest) {
return ServerResponse.ok()
.contentType(MediaType.APPLICATION_JSON)
.body(
Flux.just(1, 2, 3, 4)
.log(), Integer.class
);
}
public Mono<ServerResponse> mono(ServerRequest serverRequest) {
return ServerResponse.ok()
.contentType(MediaType.APPLICATION_JSON)
.body(
Mono.just(1)
.log(), Integer.class
);
}路由器
@Configuration公共类RouterFunctionConfig {
@Bean
public RouterFunction<ServerResponse> route(com.Reactive.SpringReactive.handler.SampleHandlerFunction handlerFunction){
return RouterFunctions
.route(GET("/functional/flux").and(accept(MediaType.APPLICATION_JSON)),handlerFunction::flux)
.andRoute(GET("/functional/mono").and(accept(MediaType.APPLICATION_JSON)),handlerFunction::mono);
}}
https://stackoverflow.com/questions/65449469
复制相似问题