如何用Spring WebFlux返回404

我有一个这样的控制器(在Kotlin中):

@RestController @RequestMapping("/") class CustomerController (private val service: CustomerService) { @GetMapping("/{id}") fun findById(@PathVariable id: String, @RequestHeader(value = IF_NONE_MATCH) versionHeader: String?): Mono<HttpEntity<KundeResource>> = return service.findById(id) .switchIfEmpty(Mono.error(NotFoundException())) .map { // ETag stuff ... ok().eTag("...").body(...) } } 

我想知道是否有一个更好的方法比抛出一个异常是用@ResponseStatus(code = NOT_FOUND)注解@ResponseStatus(code = NOT_FOUND)

当Spring 5稳定时,我会撒谎使用RouteFunction而不是@RestController。 定义HandlerFunction来处理请求,然后声明一个RouteFunction来将请求映射到HandlerFunction:

 public Mono<ServerResponse> get(ServerRequest req) { return this.posts .findById(req.pathVariable("id")) .flatMap((post) -> ServerResponse.ok().body(Mono.just(post), Post.class)) .switchIfEmpty(ServerResponse.notFound().build()); } 

Kotlin版本,并使用RouteFunctionDSL将传入的请求映射到HandlerFuncation:

 fun get(req: ServerRequest): Mono<ServerResponse> { return this.posts.findById(req.pathVariable("id")) .flatMap { post -> ok().body(Mono.just(post), Post::class.java) } .switchIfEmpty(notFound().build()) } 

它可以是一个表达式,如:

 fun get(req: ServerRequest): Mono<ServerResponse> = this.posts.findById(req.pathVariable("id")) .flatMap { post -> ok().body(Mono.just(post), Post::class.java) } .switchIfEmpty(notFound().build()) 

该方法的实现可以改为,而不是引发异常

 fun findById(@PathVariable id: String, @RequestHeader(value = IF_NONE_MATCH) versionHeader: String?): Mono<ResponseEntity<KundeResource>> = return service.findById(id) .map { // ETag stuff ... ok().eTag("...").body(...) } .defaultIfEmpty(notFound().build())