From fff9461d35ac5a217b4d56f9b86f8e1956f7d482 Mon Sep 17 00:00:00 2001 From: fingerfrings Date: Thu, 14 Nov 2024 02:05:14 +0800 Subject: [PATCH] =?UTF-8?q?feat(processor):=20=E6=94=AF=E6=8C=81=E5=9C=A8?= =?UTF-8?q?=E6=B3=A8=E8=A7=A3=E4=B8=8A=E4=BD=BF=E7=94=A8=20@AutoMapping-?= =?UTF-8?q?=20=E6=96=B0=E5=A2=9E=E5=A4=84=E7=90=86=E6=B3=A8=E8=A7=A3?= =?UTF-8?q?=E4=B8=8A=E5=AD=98=E5=9C=A8=20@AutoMapping=20=E7=9A=84=E9=80=BB?= =?UTF-8?q?=E8=BE=91=20-=20=E4=BF=AE=E6=94=B9=20@AutoMapping=20=E6=B3=A8?= =?UTF-8?q?=E8=A7=A3=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=AF=B9=20ElementType.ANN?= =?UTF-8?q?OTATION=5FTYPE=20=E7=9A=84=E6=94=AF=E6=8C=81=20=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E5=AE=9E=E7=8E=B0=E5=A6=82=E4=B8=8B=E6=95=88=E6=9E=9C?= =?UTF-8?q?=EF=BC=9A=20//=E6=96=B0=E5=A2=9Edto=E4=BD=BF=E7=94=A8=E6=B3=A8?= =?UTF-8?q?=E8=A7=A3=EF=BC=8C=E8=87=AA=E5=8A=A8=E5=B0=86=E5=BD=93=E5=89=8D?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=98=A0=E5=B0=84=E5=88=B0=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E4=BA=BA=E5=AD=97=E6=AE=B5=20@AutoMapping(source=20=3D=20"oper?= =?UTF-8?q?atorUserId",=20target=20=3D=20"createBy")=20public=20@interface?= =?UTF-8?q?=20CreateMapper=20{=20}=20@AutoMapping(source=20=3D=20"operator?= =?UTF-8?q?UserId",=20target=20=3D=20"createBy")?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit // 更新dto使用注解,自动将当前用户映射到updateBy字段 @AutoMapping(source = "operatorUserId", target = "updateBy") public @interface UpdateMapper{ } 这样就可以将基类中的operatorUserId根据dto的不同,映射到对应的字段 --- .../processor/AutoMapperProcessor.java | 34 ++++++++++++++++--- .../linpeilie/annotations/AutoMapping.java | 2 +- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/AutoMapperProcessor.java b/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/AutoMapperProcessor.java index 978a4d9..87158aa 100644 --- a/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/AutoMapperProcessor.java +++ b/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/AutoMapperProcessor.java @@ -57,10 +57,8 @@ import javax.annotation.processing.RoundEnvironment; import javax.annotation.processing.SupportedAnnotationTypes; import javax.annotation.processing.SupportedOptions; import javax.lang.model.SourceVersion; -import javax.lang.model.element.Element; -import javax.lang.model.element.ElementKind; -import javax.lang.model.element.ExecutableElement; -import javax.lang.model.element.TypeElement; +import javax.lang.model.element.*; +import javax.lang.model.type.DeclaredType; import javax.lang.model.type.MirroredTypeException; import javax.lang.model.type.MirroredTypesException; import javax.lang.model.type.TypeMirror; @@ -990,6 +988,8 @@ public class AutoMapperProcessor extends AbstractProcessor { return list; } + list.addAll(buildMirrorAnno(autoMapperEle)); + for (Element ele : autoMapperEle.getEnclosedElements()) { if (ele.getKind() != ElementKind.FIELD && ele.getKind() != ElementKind.METHOD) { continue; @@ -1010,6 +1010,32 @@ public class AutoMapperProcessor extends AbstractProcessor { list.removeIf(Objects::isNull); return list; } + /** + * 处理注解上存在@AutoMapping的情况 + * + * @param element element + */ + private List buildMirrorAnno(final TypeElement element) { + List list = new ArrayList<>(); + List allAnnotationMirrors = processingEnv.getElementUtils().getAllAnnotationMirrors(element); + for (AnnotationMirror annotationMirror : allAnnotationMirrors) { + DeclaredType annotationType = annotationMirror.getAnnotationType(); + TypeElement annotationElement = (TypeElement) annotationType.asElement(); + if (annotationElement == null) { + continue; + } + AutoMappingGem autoMappingGem = AutoMappingGem.instanceOn(annotationElement); + if (autoMappingGem != null && autoMappingGem.isValid()) { + list.add(buildAutoMappingMetadata(autoMappingGem, element)); + } + AutoMappingsGem autoMappingsGem = AutoMappingsGem.instanceOn(element); + if (autoMappingsGem != null && autoMappingsGem.isValid()) { + autoMappingsGem.value().get().forEach(a -> list.add(buildAutoMappingMetadata(a, element))); + } + } + return list; + } + private AutoMappingMetadata buildAutoMappingMetadata(AutoMappingGem autoMappingGem, Element ele) { ClassName targetClass = transToClassName(autoMappingGem.targetClass().get()); diff --git a/mapstruct-plus/src/main/java/io/github/linpeilie/annotations/AutoMapping.java b/mapstruct-plus/src/main/java/io/github/linpeilie/annotations/AutoMapping.java index 93166fa..69578e8 100644 --- a/mapstruct-plus/src/main/java/io/github/linpeilie/annotations/AutoMapping.java +++ b/mapstruct-plus/src/main/java/io/github/linpeilie/annotations/AutoMapping.java @@ -18,7 +18,7 @@ import org.mapstruct.control.MappingControl; import static org.mapstruct.NullValueCheckStrategy.ON_IMPLICIT_CONVERSION; -@Target({ElementType.FIELD, ElementType.METHOD}) +@Target({ElementType.FIELD, ElementType.METHOD,ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.CLASS) public @interface AutoMapping {