看代码,不解释
package com.example.mongodemo.config;
import java.lang.annotation.*;
/**
* @Author lyr
* @create 2020/3/31 11:27
*/
@Target(ElementType.METHOD)//打到方法上
@Retention(RetentionPolicy.RUNTIME)//运行时
@Documented
public @interface Check {
String value() default "1";//1的话就检查,然后封装异常结果,0的话就不检查,继续往外抛,抛到 controller上处理结果
}
定义切面:
package com.example.mongodemo.config;
import com.example.mongodemo.code.ResultCode;
import com.example.mongodemo.dto.ResultDTO;
import com.example.mongodemo.exception.ServiceException;
import javafx.scene.control.CheckBox;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import java.lang.reflect.Type;
import java.util.Collections;
import java.util.List;
/**
* @Author lyr
* @create 2020/3/31 11:32
*/
@Aspect
@Component
@Slf4j
public class ServiceExceptionHandler {
@Pointcut("@annotation(Check)")
public void delegate(){}
@SneakyThrows
@Around("delegate()")
public Object around(ProceedingJoinPoint pjp) {
Object result = null;
try{
//System.out.println("方法返回值:: "+getReturnType(pjp));
// if(t instanceof ResultDTO) {
// System.out.println(111);
// }else {
// System.out.println(222);
// }
result = pjp.proceed();
return result;
} catch (Throwable throwable) {
Check annotation = ((MethodSignature)pjp.getSignature()).getMethod().getAnnotation(Check.class);
if ("1".equals(annotation.value())) {
//如果是1的话就 返回错误信息给前端,并打印日志, 如果是0的话 就直接往外抛异常,给Controller处理,同时打印日志
Type t = getReturnType(pjp);
if(t instanceof ResultDTO) {
return getFailResult();
}
log.error("出现异常 service: {}",throwable.toString());
return null;
}else{
throw new ServiceException(ResultCode.SERVICE_ERROR,throwable);
}
}
}
private static Type getReturnType(ProceedingJoinPoint pjp) throws NoSuchMethodException {
return ((MethodSignature)pjp.getSignature()).getMethod().getReturnType();
}
private static ResultDTO getFailResult() {
ResultDTO resultDTO = ResultDTO.getFailForPost();
resultDTO.setMessage("服务器运行异常");
return resultDTO;
}
}