首页 > 解决方案 > 在 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);
}

标签: javaspringrestexception-handling

解决方案


我认为为类提供异常处理程序Exception是一种不好的做法。大多数异常通常从Exception类继承,然后由您的handleApplicationException处理程序捕获。

专注于处理特定的异常。

例如,如果客户端发送了一个格式错误的 JSONHttpMessageNotReadableException并被抛出,您可以在异常处理程序中捕获它并使用它执行您想要的操作,或者通过简单地删除Spring的异常处理程序将返回响应。Exception.class400 - BAD REQUEST


推荐阅读