Spring Boot Sping Boot reactive rest控制器异常处理程序

ymzxtsji  于 2023-04-06  发布在  Spring
关注(0)|答案(1)|浏览(190)

在一个基于React式框架的spring Boot rest控制器中,如何在全局级别(类似于spring mvc中的全局异常处理器)根据应用程序抛出的异常类型配置错误响应状态,仍然保留spring boot生成的json错误?
例如,如果抛出IllegalArgumentException,则响应将是:

HTTP/1.1 400 Bad Request
Content-Type: application/json
Content-Length: 191

{
    "timestamp": "2023-04-05T06:52:30.521+00:00",
    "path": "request/path",
    "status": 400,
    "error": "Bad Request",
    "requestId": "876c0e0b-1"
}

而不是默认值:

HTTP/1.1 500 Internal Server Error
Content-Type: application/json
Content-Length: 191

{
    "timestamp": "2023-04-05T06:52:30.521+00:00",
    "path": "request/path",
    "status": 500,
    "error": "Internal Server Error",
    "requestId": "876c0e0b-1"
}

谢谢

b4lqfgs4

b4lqfgs41#

以保留spring Boot 生成的json错误
最好(我认为):

扩展ResponseEntityExceptionHandler

例如:

@ControllerAdvice
class MyAdvice extends ResponseEntityExceptionHandler {

    // ...
}

(this知道你的application.properties.. esp. spring.webflux.problemdetails.enabled

自定义处理“常见异常”

只是根据异常类型更改状态
覆盖相应的handleXXXException方法,在这个(400)场景中,例如(handleResponseStatusException):

@ControllerAdvice
class MyAdvice extends ResponseEntityExceptionHandler {

    @Override
    protected Mono<ResponseEntity<Object>> handleResponseStatusException(
            ResponseStatusException ex, HttpHeaders headers, HttpStatusCode status,
            ServerWebExchange exchange) {
        // do what you need/like:
        HttpStatusCode myNewStatus;
        /*
       
        switch (status.value()) { // alternatively: if (status.isXXX()) [else if .. else ..]
           ...
        }*/
        return /*super.*/handleExceptionInternal(ex, null, headers, myNewStatus, exchange);
    }
}

常见处理“自定义异常”

最佳:
1.让您的“自定义异常”扩展ErrorResponseException

class MyException extends ErrorResponseException {

  public MyException(HttpStatusCode status) { // we need to override (at least 1) super constructor!
    super(status);
  }
}

1.用自定义异常处理程序处理它(重用父方法;):

@ControllerAdvice
class MyAdvice extends ResponseEntityExceptionHandler {
  // ...
  @ExceptionHandler({MyException.class})
  public Mono<ResponseEntity<Object>> handleMyException(MyException ex, ServerWebExchange exchange) {
    return handleExceptionInternal(ex, null, ex.getHeaders(), ex.getStatusCode(), exchange);
  }
  // ...
}

详情,最好:“浏览”javadoc,源代码,“层次结构”&“使用”提到的类。
(springboot-webflux)默认的@ControllerAdvice/ResponseEntityExceptionHandler配置为org.springframework.boot.autoconfigure.web.reactive.ProblemDetailsExceptionHandler

相关问题