在使用aop需要在spring.xml和springmvc.xml配置文件中开启代理
<!--开启代理-->
<aop:aspectj-autoproxy/>
注解类
@Component
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AsynchronousExceptionHandler {
String value() default "";
String returnType() default "";
}
通知类
1.用来处理异常判断返回不同JSON
@Aspect
@Component
public class AsynchronousExceptionAdvice {
/**
* 环绕通知
* @param joinPoint
* @param asynchronousExceptionHandler
* @return
*/
@Around("@annotation(asynchronousExceptionHandler)")
public Object around(ProceedingJoinPoint joinPoint, AsynchronousExceptionHandler asynchronousExceptionHandler){
String value = asynchronousExceptionHandler.value();
System.out.println(value+"环绕通知起作用了");
Object result = null;
try {
result=joinPoint.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
try {
if (throwable instanceof AccessDeniedException) {
return DataResults.fail(ResultCode.NO_RIGTHS);//403
}else {
return DataResults.fail(ResultCode.FAIL);//500
}
}catch (Exception e) {
e.printStackTrace();
}
}
return result;
}
}
2.当前端同步异步混乱时 可以根据使用 设置注解returnType参数进行判断
@Aspect
@Component
public class AsynchronousExceptionAdvice {
/**
* 环绕通知
* @param joinPoint
* @param asynchronousExceptionHandler
* @return
*/
@Around("@annotation(asynchronousExceptionHandler)")
public Object around(ProceedingJoinPoint joinPoint, AsynchronousExceptionHandler asynchronousExceptionHandler){
String returnType = asynchronousExceptionHandler.returnType();
if ("DataResults".equals(returnType)){
//.....
}else if ("String".equals(returnType)){
//.....
}else {
//.....
}
return null;
}
}
注解的使用
@AsynchronousExceptionHandler(returnType="DataResults",value = "5")