SpringBoot全局异常处理之解决404/500错误
前言
SpringBoot要全局处理 Spring Boot 应用程序中的 HTTP 404 和 500 错误,您可以自定义一个异常处理器类,并使用 @ControllerAdvice
和 @ExceptionHandler
注释来拦截和处理这些异常。
解决方案
下面是一种可能的实现方式,它捕获HTTP GET请求中PathVariable
参数类型不匹配、参数格式错误以及其他所有未处理的异常,并返回一个包含错误代码和错误消息的 Map 对象:
@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; } }
说明:
在此示例中:
- 使用
@ControllerAdvice
和@ExceptionHandler
注释标识此类为全局异常处理程序,并捕获了MethodArgumentTypeMismatchException
和任何其他未处理的异常。 - 使用
@ResponseStatus(HttpStatus.BAD_REQUEST)
和@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
来指定异常的 HTTP 响应状态码。 - 使用
@ResponseBody
注释来告诉 Spring Boot 应用程序,我们不想呈现采用模板引擎进行渲染的视图,而是返回具体的响应正文对象。createErrorResponse()
方法创建并返回包含错误代码和错误消息的 Map 对象。
通用的全局异常处理
@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()); } }
触发异常
我们在控制器中模拟一个用户登录失败的场景,并将 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 或用户信息 // ...... } }
总结
到此这篇关于SpringBoot全局异常处理之解决404/500错误的文章就介绍到这了,更多相关SpringBoot解决404 500错误内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SSH框架网上商城项目第29战之使用JsChart技术显示商品销售报表
这篇文章主要为大家详细介绍了SSH框架网上商城项目第29战之使用JsChart技术显示商品销售报表,感兴趣的小伙伴们可以参考一下2016-06-06SpringBoot使用Maven打包异常-引入外部jar的问题及解决方案
这篇文章主要介绍了SpringBoot使用Maven打包异常-引入外部jar,需要的朋友可以参考下2020-06-06java web学习_浅谈request对象中get和post的差异
下面小编就为大家带来一篇java web学习_浅谈request对象中get和post的差异。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-05-05
最新评论