【问题标题】:How to handle Internal server error (500) on spring rest API to custom the message?如何处理 Spring Rest API 上的内部服务器错误(500)以自定义消息?
【发布时间】: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 正在处理并向用户构建最终消息。 有什么想法可以解决这个问题吗? 谢谢。

【问题讨论】:

    标签: spring-mvc exception


    【解决方案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 捕获......并按照异常类型。
    猜你喜欢
    • 2018-07-08
    • 2020-02-19
    • 2016-01-10
    • 2023-03-29
    • 1970-01-01
    • 2022-10-12
    • 2020-08-23
    • 2018-09-30
    • 1970-01-01
    相关资源
    最近更新 更多