在Spring框架中,我们可以使用AOP(面向切面编程)和自定义注解来统一处理异常并返回统一的结果。下面是一个简单的例子:
首先,我们定义一个自定义注解@ExceptionResult
:
- @Target({ElementType.METHOD})
- @Retention(RetentionPolicy.RUNTIME)
- public @interface ExceptionResult {
- }
然后,我们创建一个切面,用于拦截带有@ExceptionResult
注解的方法:
- @Aspect
- @Component
- public class ExceptionResultAspect {
-
- @Around("@annotation(exceptionResult)")
- public Object around(ProceedingJoinPoint joinPoint, ExceptionResult exceptionResult) {
- try {
- // 执行方法
- return joinPoint.proceed();
- } catch (Throwable e) {
- // 捕获异常,返回统一的结果
- return handleException(e);
- }
- }
-
- private Object handleException(Throwable e) {
- // 这里只是一个简单的例子,你可以根据实际情况来处理异常
- Map
result = new HashMap<>(); - result.put("code", 500);
- result.put("message", e.getMessage());
- return result;
- }
- }
在这个切面中,我们使用@Around
注解来定义一个环绕通知,它会在带有@ExceptionResult
注解的方法执行前后都执行。在通知中,我们首先尝试执行方法,如果发生异常,我们就捕获这个异常,并返回一个统一的结果。
最后,我们可以在需要统一处理异常的方法上使用@ExceptionResult
注解:
- @RestController
- public class TestController {
-
- @ExceptionResult
- @GetMapping("/test")
- public String test() {
- // 这里故意抛出一个异常
- throw new RuntimeException("Test exception");
- }
- }
这样,当/test
接口发生异常时,就会被ExceptionResultAspect
切面捕获,并返回统一的结果。