aop +反射处理 service异常

看代码,不解释

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;
    }


}

发布了174 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43923045/article/details/105219739