spring 引导中的生产级异常处理

Production level Exception handling in spring boot

我有一个场景:

            UI<--->Spring boot micro-service REST API<--->server

现在,有一种情况我想处理自定义异常(我知道该怎么做)以便 return 特定的 Http 状态和消息返回到 UI 服务器时以某种方式回应,例如500应该return"Please return after a while"偷取"internal server error"。我们微服务的 Maven 项目分为 3 层(子 Maven 项目),即业务、Web 和域。其中 web 包含控制器 class,业务包含服务 class,域包含 @Entity、@Components 等

我想知道为了处理上面提到的异常假设 HTTP Status 500,应该在业务层完成吗?或在网络层,即控制器级别。最好的解决方案是什么? (我知道 ResponseEntity 以及它如何提供对 UI 的自定义响应)。

我个人认为,如果我在业务级别包含自定义异常 class 并且在控制器 class 中包含检查响应状态后使用响应实体的 return 就可以解决问题。但是官方觉得应该在服务层面做?我不明白为什么(这使过程更加复杂)?谁能建议哪种解决方案最好?

错误响应通常由 @ExceptionHandler 匹配您的异常类型生成,并且可能按照 here.

所述注册到 @ConrtrollerAdvice

API 应该标准化(例如 http://jsonapi.org/)并主要为开发人员设计。返回 "Please return after a while" 而不是 "Internal Server Error" 对我来说意义不大。这是不确定原因的 500 HTTP 状态响应,例如NullPointerException 代码深处。

官方说的对,应该是Service Layer。我会说最佳实践是使用@ExceptionHandler。由于在控制器方法中处理异常的缺点是它会降低代码的可读性,并且可能会在许多控制器方法中重复出现。

我建议为您的控制器设置一个基础 class,并定义了 @ExceptionHandler。这样它就可以用于许多不同的控制器,而无需任何代码重复。这将比异常解析器方法更具可读性,但可以结合使用 这个解释的很清楚here

如果你想在全局级别处理错误,你可以使用@ControllerAdvice,这在处理自定义异常和运行时异常时非常容易。

您可以从业务层向 Web 控制器抛出异常并定义 @ControllerAdvice class 来捕获这些错误并提供具有正确响应状态的响应。

例如:-

@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(value = { IllegalArgumentException.class, IllegalStateException.class })
    protected ResponseEntity<Object> handleConflict(RuntimeException ex, WebRequest request) {
        String bodyOfResponse = "This should be application specific";
        return handleExceptionInternal(ex, bodyOfResponse, 
          new HttpHeaders(), HttpStatus.CONFLICT, request);
    }
}

并从控制器中抛出那些异常classes classes 同样,您不需要从控制器中捕获异常。

希望对您有所帮助...

以上代码片段我取自here