如何处理 Spring Rest API 上的内部服务器错误(500)以自定义消息?

Posted

技术标签:

【中文标题】如何处理 Spring Rest API 上的内部服务器错误(500)以自定义消息?【英文标题】:How to handle Internal server error (500) on spring rest API to custom the message? 【发布时间】:2020-02-07 07:27:58 【问题描述】:

我正在开发 spring rest api,我想确保一切正常。我想记录异常行为数据库连接错误等,我正在使用 couchbase 数据库,并且我正在获取端点响应,例如这种异常:CouchbaseQueryExecutionException 下一条消息:Unable to execute query due to the following n1ql errors: \n\"msg\":\"No index available on keyspace kids_club that matches your query. Use CREATE INDEX or CREATE PRIMARY INDEX to create an index, or check that your expected index is online.\",\"code\":4000 和一个非常很长的痕迹。

为此,我在互联网上找到了一个扩展 ResponseEntityExceptionHandler 并覆盖 handleExceptionInternal 方法的解决方案,如下所示:

@ControllerAdvice
public class RestExceptionHandler extends ResponseEntityExceptionHandler 
    private static String DEFAULT_VALIDATION_ERROR_CODE = "KC-0020";

    @ExceptionHandler(MiddlewareException.class)
    protected ResponseEntity<ResponseBody> handleKidsClubException(MiddlewareException ex) 
        return buildErrorResponse(HttpStatus.valueOf(ex.getHttpStatus()), ex.toError());
    

    @ExceptionHandler(ServiceUnavailableException.class)
    protected ResponseEntity<ResponseBody> handleServiceUnavailable(ServiceUnavailableException ex) 
        return buildErrorResponse(INTERNAL_SERVER_ERROR, ex);
    

    @ExceptionHandler(NoSuchElementException.class)
    protected ResponseEntity<ResponseBody> handleNoFoundElement(NoSuchElementException ex) 
        return buildErrorResponse(NOT_FOUND, ex);
    

    @ExceptionHandler(CouchbaseQueryExecutionException.class)
    protected ResponseEntity<ResponseBody> handleCouchbaseQueryException(ConstraintViolationException ex) 
        return buildErrorResponse(BAD_REQUEST, ex);
    


但我无法以这种方式捕获任何类型的内部服务器错误。 似乎 spring 正在处理并向用户构建最终消息。 有什么想法可以解决这个问题吗? 谢谢。

【问题讨论】:

【参考方案1】:
@ExceptionHandler(NullPointerException.class)
public final ResponseEntity<Object> handleNullPointerException(NullPointerException ex, WebRequest request) 
    LOGGER.info("Entering into the handleAllException method");
    System.out.println("Exception is : " + ex.getClass());
    ResponseData error = new ResponseData();
    error.setRespCode(HttpStatus.NOT_FOUND.toString());
    error.setRespMessage(ex.getLocalizedMessage());
    error.setTimestamp(LocalDateTime.now());
    return new ResponseEntity(error, HttpStatus.INTERNAL_SERVER_ERROR);




请在下面尝试这种方式来检查您是否能够捕获异常。从系统输出中您将获得确切的异常。然后,您可以使用该异常从该业务逻辑中捕获任何特定异常。

【讨论】:

但问题是@ControllerAdvice 只处理控制器和服务问题,而不是服务器问题。 这个过程就像我只从控制器类中抛出。我正在调用服务和 dao 层但如果发生任何异常,它会被@controlleradvice 捕获......并按照异常类型。

以上是关于如何处理 Spring Rest API 上的内部服务器错误(500)以自定义消息?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 REST api 中的关系

如何处理 URL(Spring、REST、CXF)中的转义字符(管道 |)?

调用 REST API 时如何处理 Google Ads API 速率限制?

如何处理 Spring Rest Web 服务中的 JSON 解析错误

如何处理 grails spring-security-rest 插件中的自定义身份验证异常?

WooCommerce REST API v2:如何处理付款?