生产级别春季启动时的异常处理

时间:2018-03-08 15:46:40

标签: java spring rest spring-boot exception-handling

我有一个场景:

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

现在,我希望处理自定义异常(我知道该怎么做)以便在服务器以某种方式响应时将特定的Http状态和消息返回给UI。 500应返回&#34;请在一段时间后返回&#34;内部服务器错误&#34;内部服务器错误&#34;。我们的微服务的maven项目分为3层(子maven项目),即Business,Web和Domain。其中web包含控制器类,Business包含Service类,Domain包含@ Entity,@ Component等。

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

我个人认为,如果我在Business Level中包含自定义异常类,并在检查响应状态后使用响应实体在Controller类中返回该异常类就可以了。但官员认为应该在服务水平上完成?我无法理解为什么(它使过程更复杂)?谁能建议哪种解决方案最好?

3 个答案:

答案 0 :(得分:3)

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

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

对于Ex: -

@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);
    }
}

并从控制器类中抛出那些Exception类,你不需要从控制器中捕获异常。

希望这对你有帮助......

我从here

获取的代码信息

答案 1 :(得分:2)

官员是对的,它应该在服务层。我会说最好的做法是使用@ExceptionHandler。由于在控制器方法中处理异常的缺点是它使代码的可读性降低,并且可能会在许多控制器方法中重复。

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

答案 2 :(得分:0)

错误响应通常由匹配您的例外类型的@ExceptionHandler生成,并且可能已按here所述的@ConrtrollerAdvice注册。

API应该标准化(例如http://jsonapi.org/),主要是为开发人员设计的。返回&#34;请稍后返回&#34;而不是&#34;内部服务器错误&#34;对我来说没什么意义。它是一个不确定原因的500 HTTP状态响应,例如NullPointerException代码深处的某个地方。

相关问题