如何处理 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)以自定义消息?的主要内容,如果未能解决你的问题,请参考以下文章
如何处理 URL(Spring、REST、CXF)中的转义字符(管道 |)?
调用 REST API 时如何处理 Google Ads API 速率限制?
如何处理 Spring Rest Web 服务中的 JSON 解析错误