java - 在 Spring Boot 中提供通用异常处理程序,将所有异常转换为 HTTP 500
问题描述
在我的应用程序中,我为特定异常和通用异常 ( Exception.class
) 提供了处理程序。问题是每当向 API 提供错误的输入时,它都会抛出BAD REQUEST
(HTTP-400)。但是,如果出现 BAD 请求,它会返回 HTTP-500。验证 spring boot 会自动触发自身,但是被 handleApplicationException 捕获。
@ExceptionHandler(value = Exception.class)
public ResponseEntity<ErrorResponseDTO> handleApplicationException(final Exception ex) {
LOGGER.error("Unhandled Exception occurred ", ex);
ErrorResponseDTO errorResponseDTO = new ErrorResponseDTO();
errorResponseDTO.setMessage("Internal Server Error");
errorResponseDTO.setHttpStatus(HttpStatus.INTERNAL_SERVER_ERROR);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(errorResponseDTO);
}
@ExceptionHandler(value = ResourceNotFoundException.class)
public ResponseEntity<ErrorResponseDTO> handleResourceNotFoundException(final ResourceNotFoundException
notFoundException) {
LOGGER.error("Handling resource not found exception", notFoundException);
ErrorResponseDTO errorResponseDTO = new ErrorResponseDTO();
errorResponseDTO.setMessage(notFoundException.getMessage());
errorResponseDTO.setHttpStatus(HttpStatus.NOT_FOUND);
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(errorResponseDTO);
}
解决方案
我认为为类提供异常处理程序Exception
是一种不好的做法。大多数异常通常从Exception
类继承,然后由您的handleApplicationException
处理程序捕获。
专注于处理特定的异常。
例如,如果客户端发送了一个格式错误的 JSONHttpMessageNotReadableException
并被抛出,您可以在异常处理程序中捕获它并使用它执行您想要的操作,或者通过简单地删除Spring的异常处理程序将返回响应。Exception.class
400 - BAD REQUEST
推荐阅读
- .net-core - .net 核心身份服务器 4:使用用户名或电子邮件登录?
- r - 如何在不用于下标的下标之后放置上标
- android-recyclerview - recyclerview中的多个视图
- php - How to use filter_input with array?
- python - 熊猫索引作为标题出现
- html - What is the default browser form behavior for POST method?
- aws-step-functions - 能够映射到 Step Functions 中的单独任务 ARN?
- postgresql - UNION ALL 参数化 postgres
- c# - 正则表达式用 \\ 替换问题
- ssis - 在 SSIS 中映射新字段