如何用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> = return service.findById(id) .switchIfEmpty(Mono.error(NotFoundException())) .map { // ETag stuff ... ok().eTag("...").body(...) } }
我想知道是否有一个更好的方法比抛出一个exception是用@ResponseStatus(code = NOT_FOUND)
注解@ResponseStatus(code = NOT_FOUND)
当Spring 5稳定时,我想使用RouteFunction
而不是@RestController。 定义HandlerFunction来处理请求,然后声明一个RouteFunction
来将请求映射到HandlerFunction:
public Mono 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 { return this.posts.findById(req.pathVariable("id")) .flatMap { post -> ok().body(Mono.just(post), Post::class.java) } .switchIfEmpty(notFound().build()) }
它可以是一个expression式,如:
fun get(req: ServerRequest): Mono = this.posts.findById(req.pathVariable("id")) .flatMap { post -> ok().body(Mono.just(post), Post::class.java) } .switchIfEmpty(notFound().build())
在这里查看Kotlin DSL的完整示例代码。
方法的实现可以改为,而不是引发exception
fun findById(@PathVariable id: String, @RequestHeader(value = IF_NONE_MATCH) versionHeader: String?): Mono> = return service.findById(id) .map { // ETag stuff ... ok().eTag("...").body(...) } .defaultIfEmpty(notFound().build())