SpringBoot global exception handling - solve 404/500

SpringBoot global exception handling - solve 404/500

SpringBoot To globally handle HTTP 404 and 500 errors in Spring Boot applications, you can customize an exception handler class and use @ControllerAdviceand @ExceptionHandlerannotations to intercept and handle these exceptions.

solution

The following is a possible implementation, which catches parameter type mismatch, parameter format error, and all other unhandled exceptions in HTTP GET requests , and returns a Map object containing error codes and error messages:PathVariable

@ControllerAdvice
public class GlobalExceptionHandler {
    
    
     
    // 捕获 PathVariable 参数类型不匹配或格式错误的异常,并返回错误信息
    @ExceptionHandler(MethodArgumentTypeMismatchException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ResponseBody
    public Map<String, Object> handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException ex) {
    
    
        return createErrorResponse(HttpStatus.BAD_REQUEST.value(), "请求参数有误: " + ex.getMessage());
    }
 
    // 捕获其他未处理的异常,并返回错误信息
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public Map<String, Object> handleUncaughtException(Exception ex) {
    
    
        return createErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(), "系统内部错误: " + ex.getMessage());
    }
 
    // 创建包含错误码和错误消息的 Map 对象
    private Map<String, Object> createErrorResponse(int code, String message) {
    
    
        Map<String, Object> errorResponse = new HashMap<>();
        errorResponse.put("code", code);
        errorResponse.put("message", message);
        return errorResponse;
    }
}

illustrate:

In this example:

  • The @ControllerAdviceand @ExceptionHandlerannotations identify this class as a global exception handler, and catch MethodArgumentTypeMismatchExceptionand any other unhandled exceptions.
  • Use @ResponseStatus(HttpStatus.BAD_REQUEST) and @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) to specify the HTTP response status code for exceptions.
  • Use @ResponseBodyannotations to tell the Spring Boot application that we don't want to render a view rendered with a templating engine, but instead return a concrete response body object.
    createErrorResponse()Method creates and returns a Map object containing error codes and error messages.

Generic global exception handling

@ControllerAdvice
public class GlobalExceptionHandler {
    
    
    
    /**
     * 处理 HTTP 404 错误
     */
    @ExceptionHandler(NoHandlerFoundException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    @ResponseBody
    public ApiError handleNotFound(HttpServletRequest req, Exception ex) {
    
    
        return new ApiError(HttpStatus.NOT_FOUND.value(), "无该资源: " + req.getRequestURI());
    }
 
    /**
     * 处理 HTTP 500 错误
     */
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public ApiError handleInternalServerError(HttpServletRequest req, Exception ex) {
    
    
        return new ApiError(HttpStatus.INTERNAL_SERVER_ERROR.value(), "服务器内部错误: " + ex.getMessage());
    }
 
    /**
     * 处理用户登录异常
     */
    @ExceptionHandler(UserLoginException.class)
    @ResponseStatus(HttpStatus.UNAUTHORIZED)
    @ResponseBody
    public ApiError handleUserLoginException(HttpServletRequest req, UserLoginException ex) {
    
    
        return new ApiError(HttpStatus.UNAUTHORIZED.value(), "用户登录失败: " + ex.getMessage());
    }
 
    /**
     * 处理其他所有未处理的异常
     */
    @ExceptionHandler(Throwable.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public ApiError handleOtherExceptions(HttpServletRequest req, Throwable ex) {
    
    
        return new ApiError(HttpStatus.INTERNAL_SERVER_ERROR.value(), "系统内部错误: " + ex.getMessage());
    }
}

trigger exception

We simulate a user login failure scenario in the controller and throw UserLoginException:

@RestController
public class UserController {
    
    
    
    @Autowired
    private UserService userService;
    
    @PostMapping("/login")
    public String login(@RequestBody LoginForm form) {
    
    
        // 验证用户名和密码
        if (!userService.validate(form.getUsername(), form.getPassword())) {
    
    
            // 用户不存在或密码错误,抛出 UserLoginException 异常
            throw new UserLoginException("用户名或密码不正确");
        }
         
        // 登录成功,返回 token 或用户信息
        // ......
    }
}

Guess you like

Origin blog.csdn.net/weixin_46532941/article/details/130475589