Jelajahi Sumber

新增检测异常

liukx@elab 6 tahun lalu
induk
melakukan
3328234ebd

+ 88 - 0
elab-spring/src/main/java/com/elab/spring/intercept/CheckAnnotationProcess.java

@@ -0,0 +1,88 @@
+package com.elab.spring.intercept;
+
+import com.elab.core.aop.annotations.ExceptionHandle;
+import com.elab.core.exception.CheckException;
+import com.elab.core.utils.StringUtils;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.aop.support.AopUtils;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
+import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.lang.reflect.Method;
+
+/**
+ * @describe :代码检测
+ * @Author : liukx
+ * @time : 2019/3/6 - 11:44
+ */
+@Service
+public class CheckAnnotationProcess implements BeanPostProcessor, BeanFactoryPostProcessor {
+
+    private Logger logger = LoggerFactory.getLogger(com.elab.spring.process.CheckAnnotationProcess.class);
+    private ConfigurableListableBeanFactory beanFactory;
+    private boolean isException = false;
+
+    public void setException(boolean exception) {
+        isException = exception;
+    }
+
+    @Override
+    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
+        this.beanFactory = beanFactory;
+    }
+
+    @Override
+    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
+        return bean;
+    }
+
+    @Override
+    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
+        String exclude = "com.elab.marketing.auth.dao";
+        String proxyName = "com.sun.proxy";
+        if (AopUtils.isAopProxy(bean)) {
+            Class<?> targetClass = AopUtils.getTargetClass(bean);
+            String name = targetClass.getName();
+            if (!name.startsWith(exclude) && !name.startsWith(proxyName)) {
+                Method[] declaredMethods = targetClass.getDeclaredMethods();
+                for (int i = 0; i < declaredMethods.length; i++) {
+                    Method declaredMethod = declaredMethods[i];
+                    String author = "";
+                    Transactional annotation = declaredMethod.getAnnotation(Transactional.class);
+                    ApiOperation apiOperation = declaredMethod.getAnnotation(ApiOperation.class);
+                    if (apiOperation != null && StringUtils.isNotEmpty(apiOperation.nickname())) {
+                        author = apiOperation.nickname();
+                    }
+                    if (annotation != null || apiOperation != null) {
+                        ExceptionHandle exceptionHandle = declaredMethod.getAnnotation(ExceptionHandle.class);
+                        if (exceptionHandle != null) {
+                            if (StringUtils.isEmpty(exceptionHandle.username())) {
+                                String message = "请在" + name + " \t " + declaredMethod.getName() + " --> " + author + " 方法头的@ExceptionHandle 加上username属性";
+                                notifyWarning(message);
+                            }
+                        } else {
+                            String message = "请在" + name + " \t " + declaredMethod.getName() + " --> " + author + " 方法头加上 @ExceptionHandle(username = '')";
+                            notifyWarning(message);
+                        }
+                    }
+                }
+
+            }
+        }
+        return bean;
+    }
+
+    private void notifyWarning(String message) {
+        if (isException) {
+            throw new CheckException(message);
+        } else {
+            logger.error(message);
+        }
+    }
+}