抛出异常 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编译器,但我已经在脑海中编译了它:)希望它没问题!