Exception handling 如何在基于SpringWebFlux的REST服务中处理异常

Exception handling 如何在基于SpringWebFlux的REST服务中处理异常,exception-handling,spring-webflux,Exception Handling,Spring Webflux,我正在使用SpringWebFlux构建一个REST服务。当找不到请求的路径或发生任何其他内部服务器错误时,我需要使用自定义json错误响应进行响应 我有一个GeneralExceptionHandler类,它实现了ErrorWebExceptionHandler 我有一个用于GeneralExceptionHandler的bean,如下所示 @Bean @Order(-2) public ErrorWebExceptionHandler errorWebExceptionHandler() {

我正在使用SpringWebFlux构建一个REST服务。当找不到请求的路径或发生任何其他内部服务器错误时,我需要使用自定义json错误响应进行响应

我有一个
GeneralExceptionHandler
类,它实现了
ErrorWebExceptionHandler

我有一个用于
GeneralExceptionHandler
的bean,如下所示

@Bean
@Order(-2)
public ErrorWebExceptionHandler errorWebExceptionHandler() {
    return new GeneralExceptionHandler();
}
这样,在出现诸如未找到请求的路径之类的错误时,将调用
GeneralExceptionHandler
中的我的句柄方法(
public Mono handle(ServerWebExchange ServerWebExchange,Throwable Throwable)

我还可以使用下面的代码发送自定义http状态代码

serverWebExchange.getResponse().setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR)

但我不知道如何发送自定义JSON作为响应


首先,这是处理SpringWebFlux中一般错误的正确方法吗?如果是,如何使用自定义JSON对象进行响应

Spring Boot为此提供了
ErrorWebExceptionHandler
接口;它扩展了Spring框架中相当通用的低级
WebExceptionHandler

使用
WebExceptionHandler
,您确实无法处理低级概念,因为它是一种通用的错误处理机制

有几种方法可以自定义Spring Boot中的错误处理过程:

  • 创建您自己的
    ErrorAttributes
    bean,并从提供给HTML视图或呈现为JSON的错误映射中添加/删除数据
  • 如果您想进一步处理错误处理,可以扩展
    AbstractErrorWebExceptionHandler
    ,它提供了呈现HTML/响应主体的所有构建块
  • 如果您想要完全控制,您可以实现一个
    ErrorWebExceptionHandler
    ,但是您必须有类似的基础设施设置,以呈现高级概念,例如视图或序列化响应主体

    • Spring Boot为此提供了
      ErrorWebExceptionHandler
      接口;它扩展了Spring框架中相当通用的低级
      WebExceptionHandler

      使用
      WebExceptionHandler
      ,您确实无法处理低级概念,因为它是一种通用的错误处理机制

      有几种方法可以自定义Spring Boot中的错误处理过程:

      • 创建您自己的
        ErrorAttributes
        bean,并从提供给HTML视图或呈现为JSON的错误映射中添加/删除数据
      • 如果您想进一步处理错误处理,可以扩展
        AbstractErrorWebExceptionHandler
        ,它提供了呈现HTML/响应主体的所有构建块
      • 如果您想要完全控制,您可以实现一个
        ErrorWebExceptionHandler
        ,但是您必须有类似的基础设施设置,以呈现高级概念,例如视图或序列化响应主体

      您是否使用Spring Boot?Spring MVC和Spring Webflux中都有许多错误处理方法。我有一个答案,我使用全局控制器建议来处理应用程序错误并返回自定义响应。你可以查看我的答案:。@BrianClozelyes@nghiaht您的答案对应用程序错误有帮助,但对404和405错误不起作用。@Thomas在我的示例中,我通过返回HTTP 200响应(带有错误代码和消息)来处理所有错误。但是您可以返回任何HTTP状态,例如我返回401 Unauthorize
      return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(新的错误响应(例如getCode(),例如getMessage())使用您想要的任何HttpStatus,您可以在抛出它之前将状态设置为exception,并在ControllerAdvice中使用它。您使用Spring Boot吗?Spring MVC和Spring Webflux中都有许多错误处理方法。我有一个答案,我使用全局控制器建议来处理应用程序错误并返回自定义响应。你可以查看我的答案:。@BrianClozelyes@nghiaht您的答案对应用程序错误有帮助,但对404和405错误不起作用。@Thomas在我的示例中,我通过返回HTTP 200响应(带有错误代码和消息)来处理所有错误。但是您可以返回任何HTTP状态,例如我返回401 Unauthorize
      return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(新的错误响应(例如getCode(),例如getMessage())使用您想要的任何HttpStatus,您可以在抛出它之前将状态设置为exception,并在ControllerAdvice中使用它。