我有一个像这样的控制器(在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)
注释的异常
3 回答
当Spring 5稳定时,我想使用
RouteFunction
而不是@RestController . 定义HandlerFunction以处理请求,然后声明RouteFunction
以将请求映射到HandlerFunction:检查完整的示例代码here .
Kotlin版本,定义一个处理请求的函数,使用
RouteFunctionDSL
将传入的请求映射到HandlerFuncation:它可以是一个表达式,如:
查看Kotlin DSL here的完整示例代码 .
如果您更喜欢传统控制器来公开REST API,请尝试这种方法 .
首先定义一个例外,例如 .
PostNotFoundException
. 然后把它扔进控制器 .@GetMapping(value = "/{id}") public Mono<Post> get(@PathVariable(value = "id") Long id) { return this.posts.findById(id).switchIfEmpty(Mono.error(new PostNotFoundException(id))); }
定义
ExceptionHandler
来处理异常,并在HttpHandler
中注册它 .在这里查看complete codes . 对于Spring Boot用户,请检查this sample .
可以将方法的实现更改为,而不是抛出异常
您可以使用ResponseStatusException,只需扩展您的例外:
在服务中:
在那之后,你可以得到一个漂亮的信息: