将自定义异常从 Kotlin Webclient awaitExchange Lambda 函数传递到 Web 控制器的正确方法是什么?
What would be the proper way to pass custom exception from Kotlin Webclient awaitExchange Lambda function to web controller?
正在开发使用反应式 WebClient
调用另一个微服务的新微服务。
这是我的:
Controller.kts
@GetMapping(["/books/{id}"], produces = [MediaType.APPLICATION_JSON_VALUE])
suspend fun getBook(...): ResponseEntity<Any> {
val book = service.getBook(id)
return Response.ok().body(book)
}
Service.kts
suspend fun getBook(id: String): Any? {
return webClient.get()
.uri("$baseUrl")
.accept(MediaType.APPLICATION_JSON)
.awaitExchange { response ->
if(response.statusCode().is4xxClientError) {
return@awaitExchange // here is where I want to return either a custom exception as well as the status code
}
if(response.statusCode().is5xxServerError) {
return@awaitExchange // similar to above but with 500 status code
}
return@awaitExchange response.awaitBody() // otherwise just return the body object
}
}
一直很难弄清楚这一点以及如何将其传递给控制器。如果我只想 return 主体,这一切都有效,但我想添加更好的异常处理。此外,新 spring 版本 awaitExchange()
已弃用,需要使用 awaitExchange {}
lambda fun 代替。最后一件事,在 lambda 函数中,它说“'return' 现在在这里被允许”并希望我将其更改为 return@awaitExchange ...
我能够使用 onStatus(HttpStatus::is4xxClientError)
将错误传播到控制器:
Mono.error(ResponseStatusException(HttpStatus.BAD_REQUEST)
正在开发使用反应式 WebClient
调用另一个微服务的新微服务。
这是我的:
Controller.kts
@GetMapping(["/books/{id}"], produces = [MediaType.APPLICATION_JSON_VALUE])
suspend fun getBook(...): ResponseEntity<Any> {
val book = service.getBook(id)
return Response.ok().body(book)
}
Service.kts
suspend fun getBook(id: String): Any? {
return webClient.get()
.uri("$baseUrl")
.accept(MediaType.APPLICATION_JSON)
.awaitExchange { response ->
if(response.statusCode().is4xxClientError) {
return@awaitExchange // here is where I want to return either a custom exception as well as the status code
}
if(response.statusCode().is5xxServerError) {
return@awaitExchange // similar to above but with 500 status code
}
return@awaitExchange response.awaitBody() // otherwise just return the body object
}
}
一直很难弄清楚这一点以及如何将其传递给控制器。如果我只想 return 主体,这一切都有效,但我想添加更好的异常处理。此外,新 spring 版本 awaitExchange()
已弃用,需要使用 awaitExchange {}
lambda fun 代替。最后一件事,在 lambda 函数中,它说“'return' 现在在这里被允许”并希望我将其更改为 return@awaitExchange ...
我能够使用 onStatus(HttpStatus::is4xxClientError)
将错误传播到控制器:
Mono.error(ResponseStatusException(HttpStatus.BAD_REQUEST)