抛出异常 spring 启动 webflux
Throw exception spring boot webflux
我正在尝试制定一个条件,如果不满足,则抛出异常。但是我尝试了很多方法都没有成功。
我的休息控制器:
@GetMapping(value = ["/{id}"])
fun find(@PathVariable id: String): Mono<ResponseEntity<Mono<Person>>> {
return ResponseEntity.ok().body(service.find(id)).toMono()
}
我的服务
override fun find(id: String): Mono<Person> {
return repository.findById(id).doOnError { throw DataNotFound("Person not found")}
}
如果我输入现有的 ID,它 returns 我就是注册人。
但是,如果我输入一个不存在的 ID,它不会抛出异常,而是 returns 我是一个空主体的 200。
我该如何解决这个问题?有人能帮忙吗?
试试这个:
@GetMapping(value = ["/{id}"])
fun find(@PathVariable id: String): Mono<ResponseEntity<?>> {
service.find(id).map(person -> ResponseEntity.ok().body(person))
.onErrorResume(DataNotFound.class, exception -> ResponseEntity.notFound())
}
fun find(id: String): Mono<Person> {
repository.findById(id).onErrorMap(error -> new DataNotFound("Person not found"))
}
如果有人存在,returns OK 响应,否则 NOT_FOUND。
通常,在更复杂的场景中,您希望将异常转换为某种错误资源。
在这种情况下,您将为处理 HTTP 请求的方法使用相同的响应类型。更准确地说,在您的情况下:
@GetMapping(value = ["/{id}"])
fun find(@PathVariable id: String): Mono<ResponseEntity<Mono<Person>>> {
return ResponseEntity.ok().body(service.find(id)).toMono()
}
(这将保持原样!)
接下来,您将提供一个 so-called ControllerAdvice
,它可以在您的案例中看起来像以下代码段:
@ControllerAdvice(assignableTypes = [YourRestController::class]
class ControllerAdvice {
@ExceptionHandler
fun handle(ex: DataNotFoundException): ResponseEntity<DataNotFoundErrorResource> {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(DataNotFoundErrorResource.from(ex)
}
}
注意:请注意,我没有使用过Kotlin编译器,但我已经在脑海中编译了它:)希望它没问题!
我正在尝试制定一个条件,如果不满足,则抛出异常。但是我尝试了很多方法都没有成功。
我的休息控制器:
@GetMapping(value = ["/{id}"])
fun find(@PathVariable id: String): Mono<ResponseEntity<Mono<Person>>> {
return ResponseEntity.ok().body(service.find(id)).toMono()
}
我的服务
override fun find(id: String): Mono<Person> {
return repository.findById(id).doOnError { throw DataNotFound("Person not found")}
}
如果我输入现有的 ID,它 returns 我就是注册人。 但是,如果我输入一个不存在的 ID,它不会抛出异常,而是 returns 我是一个空主体的 200。
我该如何解决这个问题?有人能帮忙吗?
试试这个:
@GetMapping(value = ["/{id}"])
fun find(@PathVariable id: String): Mono<ResponseEntity<?>> {
service.find(id).map(person -> ResponseEntity.ok().body(person))
.onErrorResume(DataNotFound.class, exception -> ResponseEntity.notFound())
}
fun find(id: String): Mono<Person> {
repository.findById(id).onErrorMap(error -> new DataNotFound("Person not found"))
}
如果有人存在,returns OK 响应,否则 NOT_FOUND。
通常,在更复杂的场景中,您希望将异常转换为某种错误资源。
在这种情况下,您将为处理 HTTP 请求的方法使用相同的响应类型。更准确地说,在您的情况下:
@GetMapping(value = ["/{id}"])
fun find(@PathVariable id: String): Mono<ResponseEntity<Mono<Person>>> {
return ResponseEntity.ok().body(service.find(id)).toMono()
}
(这将保持原样!)
接下来,您将提供一个 so-called ControllerAdvice
,它可以在您的案例中看起来像以下代码段:
@ControllerAdvice(assignableTypes = [YourRestController::class]
class ControllerAdvice {
@ExceptionHandler
fun handle(ex: DataNotFoundException): ResponseEntity<DataNotFoundErrorResource> {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(DataNotFoundErrorResource.from(ex)
}
}
注意:请注意,我没有使用过Kotlin编译器,但我已经在脑海中编译了它:)希望它没问题!