SpringBoot 全局异常处理——解决404/500
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 或用户信息
// ......
}
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgaaack
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13