From 217e299291027d5cfe3fdea2fca97d657ada2126 Mon Sep 17 00:00:00 2001 From: wangxianzhang Date: Mon, 8 Aug 2022 14:28:42 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E6=8A=A5=E8=A1=A8=E3=80=91=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0AOP=E6=8B=A6=E6=88=AA=E5=99=A8=EF=BC=8C=E5=92=8C?= =?UTF-8?q?=E5=AF=B9=E5=BA=94=E7=9A=84=E6=B3=A8=E8=A7=A3=EF=BC=8C=E7=94=A8?= =?UTF-8?q?=E4=BA=8E=E6=8B=A6=E6=88=AAurl=E5=8F=82=E6=95=B0=EF=BC=8C?= =?UTF-8?q?=E7=BB=99=E5=85=B7=E6=9C=89@RequestBody=E6=B3=A8=E8=A7=A3?= =?UTF-8?q?=E7=9A=84=E5=85=A5=E5=8F=82=E8=B5=8B=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tools/annotation/ReportRequest.java | 13 ++++ .../tools/aspect/ReportRequestAspect.java | 74 +++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/annotation/ReportRequest.java create mode 100644 epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/aspect/ReportRequestAspect.java diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/annotation/ReportRequest.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/annotation/ReportRequest.java new file mode 100644 index 0000000000..41a9379fe0 --- /dev/null +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/annotation/ReportRequest.java @@ -0,0 +1,13 @@ +package com.epmet.commons.tools.annotation; + +import java.lang.annotation.*; + +/** + * 标记一个接口,它会被报表服务所调用 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface ReportRequest { + +} diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/aspect/ReportRequestAspect.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/aspect/ReportRequestAspect.java new file mode 100644 index 0000000000..81dc4facf1 --- /dev/null +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/aspect/ReportRequestAspect.java @@ -0,0 +1,74 @@ +package com.epmet.commons.tools.aspect; + +import cn.hutool.core.bean.BeanUtil; +import com.epmet.commons.tools.redis.RedisUtils; +import org.apache.commons.lang3.StringUtils; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.lang.reflect.Parameter; +import java.util.Map; + +/** + * 需要被报表服务请求的api,需要加上这个注解 + * 1.该注解会取url中固定的key,去redis获取参数,给入参dto复制 + */ +@Aspect +@Component +@Order(20) +public class ReportRequestAspect { + + /** + * 从redis中取参数用 + */ + public static final String REPORT_REDIS_KEY = "paramKey"; + + @Autowired + private RedisUtils redisUtils; + + @Before("@annotation(com.epmet.commons.tools.annotation.ReportRequest)") + public void before(JoinPoint point) { + RequestAttributes ra = RequestContextHolder.getRequestAttributes(); + ServletRequestAttributes sra = (ServletRequestAttributes) ra; + String paramKey = sra.getRequest().getParameter(REPORT_REDIS_KEY); + if (StringUtils.isBlank(paramKey)) { + // 没有携带key参数,直接跳过 + return; + } + + Map cachedParams = redisUtils.hGetAll(paramKey); + + // 使用方法签名获取出参数class列表 + Object[] args = point.getArgs(); + MethodSignature signature = (MethodSignature) point.getSignature(); + Parameter[] parameters = signature.getMethod().getParameters(); + fillArgsToRequestBody(args, cachedParams, parameters); + } + + /** + * 将redis中取出的参数,赋值到指定的入参dto上 + * @param args + * @param storedParams + */ + private void fillArgsToRequestBody(Object[] args, Map storedParams, Parameter[] parameters) { + for (int i = 0; i < args.length; i++) { + Object arg = args[i]; + Class argClazz = arg.getClass(); + RequestBody requestBodyAnno = parameters[i].getAnnotation(RequestBody.class); + if (arg != null && requestBodyAnno != null) { + Object argBean = BeanUtil.mapToBean(storedParams, arg.getClass(), true); + BeanUtil.copyProperties(argBean, arg); + return; + } + } + } +}