在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<String, Object> 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
切面捕获,并返回统一的结果。