使用@ControllerAdvice统一处理自定义异常
最近工作中涉及到捕捉AOP方法中抛出的异常。
想针对某一种异常做一个统一的处理器并封装好异常信息以JSON格式交给前端进行提示。
主要实现的话有以下几步:
1.编写自定义异常类
package com.laoxu.easyblog.exception;
/**
* @Description: 未授权异常
* @Author laoxu
* @Date 2019/7/3 21:51
**/
public class UnAuthorizedException extends RuntimeException{
private static final long serialVersionUID = 1L;
private String errorCode;
private String errorMessage;
public UnAuthorizedException(String errorCode, String errorMessage) {
this.errorCode = errorCode;
this.errorMessage = errorMessage;
}
public String getErrorCode() {
return errorCode;
}
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
public String getErrorMessage() {
return errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
}
2.编写异常处理器
package com.laoxu.easyblog.framework;
import com.laoxu.easyblog.exception.UnAuthorizedException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @Description: 异常处理器
* @Author laoxu
* @Date 2019/7/3 22:14
**/
@ControllerAdvice
public class ExceptionsHandler {
@ResponseBody
@ExceptionHandler(UnAuthorizedException.class)//可以直接写@ExceptionHandler,不指明异常类,会自动映射
public Result<String> customGenericExceptionHnadler(UnAuthorizedException exception){ //还可以声明接收其他任意参数
return ResultUtil.fail(Integer.valueOf(exception.getErrorCode()),exception.getErrorMessage());
}
}
3.包装返回信息
package com.laoxu.easyblog.framework;
/**
* 返回结果工具类
*
* @author xusucheng
* @create 2018-10-23
**/
public class ResultUtil {
public static boolean isOk(Result<?> result){
return null != result && result.getCode() == ErrorStatus.OK.getCode();
}
public static <T> Result<T> ok(){
return new Result<T>(ErrorStatus.OK);
}
public static <T> Result<T> ok(T data){
return new Result<T>(ErrorStatus.OK.getCode(), ErrorStatus.OK.getMessage(), data);
}
public static <T> Result<T> fail(){
return new Result<T>(ErrorStatus.BAD_REQUEST).fail();
}
public static <T> Result<T> status(ErrorStatus status){
return new Result<T>(status.getCode(), status.getMessage()).fail();
}
public static <T> Result<T> fail(ErrorStatus status){
return new Result<T>(status.getCode(), status.getMessage()).fail();
}
public static <T> Result<T> fail(String message){
return fail(ErrorStatus.BAD_REQUEST.getCode(), message, (T)null).fail();
}
public static <T> Result<T> fail(int code, String message){
return new Result<T>(code, message).fail();
}
public static <T> Result<T> fail(int code ,String message, T data){
return new Result<T>(code, message, data).fail();
}
public static <T> Result<T> notfound(){
return new Result<T>(ErrorStatus.NOT_FOUND).fail();
}
}
4.编写测试controller
package com.laoxu.easyblog.controller;
import com.laoxu.easyblog.exception.UnAuthorizedException;
import com.laoxu.easyblog.framework.Result;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @Description:
* @Author laoxu
* @Date 2019/7/3 22:09
**/
@Controller
@RequestMapping("/auth")
public class ExceptionController {
@RequestMapping("/getLoginUser")
public Result<String> getLoginUser(){
throw new UnAuthorizedException("403","用户未授权!");
}
}
5.编写测试页面
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>测试页</title>
<script src="../js/jquery.min.js" th:src="@{/assets/js/jquery.min.js}"></script>
</head>
<body>
<button onclick="getLoginUser();">获取用户信息</button>
<script>
function getLoginUser(){
$.ajax({
url: "/blog/auth/getLoginUser",
type: "GET",
success: function (result) {
if (result.success) {
alert("获取成功!");
} else {
alert(result.code+":"+result.message);
}
}
});
}
</script>
</body>
</html>
6.测试
分类:
# Spring-Boot
, Java-Web
标签:
ControllerAdvice
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构