From 419098528438a428fb013e19404719eeaaf1f1dd Mon Sep 17 00:00:00 2001 From: linpeilie Date: Thu, 23 Mar 2023 14:37:08 +0800 Subject: [PATCH] =?UTF-8?q?1.1.9=20-=20=E8=A7=A3=E5=86=B3=E7=BC=96?= =?UTF-8?q?=E8=AF=91=E8=AD=A6=E5=91=8A=E9=97=AE=E9=A2=98=20-=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0unmappedSourcePolicy=E3=80=81unmappedTargetPolicy?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=EF=BC=8C=E5=B9=B6=E4=B8=94=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?unmappedTargetPolicy=E9=BB=98=E8=AE=A4=E4=B8=BAignore=20-=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0Builder=E9=85=8D=E7=BD=AE=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E8=AE=BE=E7=BD=AEdisableBuilder=E9=BB=98=E8=AE=A4=E4=B8=BAtrue?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/pom.xml | 2 +- .../processor/AutoMapperProcessor.java | 7 +++ .../processor/AutoMapperProperties.java | 43 +++++++++++++++++++ .../generator/MapperConfigGenerator.java | 25 ++++++++++- .../linpeilie/annotations/MapperConfig.java | 20 +++++++++ pom.xml | 2 +- 6 files changed, 95 insertions(+), 4 deletions(-) diff --git a/example/pom.xml b/example/pom.xml index b52f425..3f5db1e 100644 --- a/example/pom.xml +++ b/example/pom.xml @@ -18,7 +18,7 @@ UTF-8 1.5.1.Final - 1.1.8 + 1.1.9 1.18.22 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 b3e8553..07e6564 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 @@ -38,6 +38,8 @@ import java.util.stream.Collectors; import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.RoundEnvironment; import javax.annotation.processing.SupportedAnnotationTypes; +import javax.annotation.processing.SupportedSourceVersion; +import javax.lang.model.SourceVersion; import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; import javax.lang.model.element.TypeElement; @@ -58,6 +60,7 @@ import static javax.tools.Diagnostic.Kind.ERROR; @SupportedAnnotationTypes({AUTO_MAPPER_ANNOTATION, AUTO_MAPPERS_ANNOTATION, AUTO_MAP_MAPPER_ANNOTATION, MAPPER_CONFIG_ANNOTATION, COMPONENT_MODEL_CONFIG_ANNOTATION}) +@SupportedSourceVersion(SourceVersion.RELEASE_17) public class AutoMapperProcessor extends AbstractProcessor { private static final ClassName MAPPING_DEFAULT_TARGET = ClassName.get("io.github.linpeilie", "DefaultMapping"); @@ -184,6 +187,10 @@ public class AutoMapperProcessor extends AbstractProcessor { element) : mapperConfig.mapperPackage(); processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "mapper package " + mapperPackage); AutoMapperProperties.setMapperPackage(mapperPackage); + AutoMapperProperties.setUnmappedSourcePolicy(mapperConfig.unmappedSourcePolicy()); + AutoMapperProperties.setUnmappedTargetPolicy(mapperConfig.unmappedTargetPolicy()); + AutoMapperProperties.setBuildMethod(mapperConfig.builder().buildMethod()); + AutoMapperProperties.setDisableBuilder(mapperConfig.builder().disableBuilder()); }); annotations.stream() .filter(this::isComponentModelConfigAnnotation) diff --git a/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/AutoMapperProperties.java b/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/AutoMapperProperties.java index 2721cd4..8302a4b 100644 --- a/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/AutoMapperProperties.java +++ b/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/AutoMapperProperties.java @@ -1,5 +1,8 @@ package io.github.linpeilie.processor; +import org.mapstruct.Builder; +import org.mapstruct.ReportingPolicy; + import static io.github.linpeilie.processor.Constants.*; public class AutoMapperProperties { @@ -8,6 +11,14 @@ public class AutoMapperProperties { private static String componentModel = DEFAULT_COMPONENT_MODEL; + private static ReportingPolicy unmappedSourcePolicy = ReportingPolicy.IGNORE; + + private static ReportingPolicy unmappedTargetPolicy = ReportingPolicy.IGNORE; + + private static String buildMethod = "build"; + + private static boolean disableBuilder = true; + public static String getMapperPackage() { return mapperPackage; } @@ -47,4 +58,36 @@ public class AutoMapperProperties { public static void setComponentModel(final String componentModel) { AutoMapperProperties.componentModel = componentModel; } + + public static ReportingPolicy getUnmappedSourcePolicy() { + return unmappedSourcePolicy; + } + + public static void setUnmappedSourcePolicy(final ReportingPolicy unmappedSourcePolicy) { + AutoMapperProperties.unmappedSourcePolicy = unmappedSourcePolicy; + } + + public static ReportingPolicy getUnmappedTargetPolicy() { + return unmappedTargetPolicy; + } + + public static void setUnmappedTargetPolicy(final ReportingPolicy unmappedTargetPolicy) { + AutoMapperProperties.unmappedTargetPolicy = unmappedTargetPolicy; + } + + public static String getBuildMethod() { + return buildMethod; + } + + public static void setBuildMethod(final String buildMethod) { + AutoMapperProperties.buildMethod = buildMethod; + } + + public static boolean isDisableBuilder() { + return disableBuilder; + } + + public static void setDisableBuilder(final boolean disableBuilder) { + AutoMapperProperties.disableBuilder = disableBuilder; + } } diff --git a/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/generator/MapperConfigGenerator.java b/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/generator/MapperConfigGenerator.java index ad0ad5b..8b9376b 100644 --- a/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/generator/MapperConfigGenerator.java +++ b/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/generator/MapperConfigGenerator.java @@ -40,11 +40,32 @@ public class MapperConfigGenerator { usesCodeBuilder.add("$T.class", ClassName.get(AutoMapperProperties.getAdapterPackage(), adapterClassName)); CodeBlock usesCodeBlock = usesCodeBuilder.add("}").build(); - return AnnotationSpec.builder(ClassName.get("org.mapstruct", "MapperConfig")) + final AnnotationSpec.Builder builder = AnnotationSpec.builder(ClassName.get("org.mapstruct", "MapperConfig")) .addMember("componentModel", CodeBlock.builder().add("$S", AutoMapperProperties.getComponentModel()).build()) - .addMember("uses", usesCodeBlock) + .addMember("uses", usesCodeBlock); + // unmappedSourcePolicy + if (AutoMapperProperties.getUnmappedSourcePolicy() != null) { + CodeBlock unmappedSourcePolicyCodeBlock = CodeBlock.builder().add("$T.$L", + ClassName.get("org.mapstruct", "ReportingPolicy"), + AutoMapperProperties.getUnmappedSourcePolicy()).build(); + builder.addMember("unmappedSourcePolicy", unmappedSourcePolicyCodeBlock); + } + + // unmappedTargetPolicy + if (AutoMapperProperties.getUnmappedTargetPolicy() != null) { + CodeBlock unmappedTargetPolicyCodeBlock = CodeBlock.builder().add("$T.$L", + ClassName.get("org.mapstruct", "ReportingPolicy"), + AutoMapperProperties.getUnmappedTargetPolicy()).build(); + builder.addMember("unmappedTargetPolicy", unmappedTargetPolicyCodeBlock); + } + // builder + CodeBlock builderCodeBlock = CodeBlock.builder() + .add("@$T(buildMethod = $S, disableBuilder = $L)", ClassName.get("org.mapstruct", "Builder"), + AutoMapperProperties.getBuildMethod(), AutoMapperProperties.isDisableBuilder()) .build(); + builder.addMember("builder", builderCodeBlock); + return builder.build(); } } diff --git a/mapstruct-plus/src/main/java/io/github/linpeilie/annotations/MapperConfig.java b/mapstruct-plus/src/main/java/io/github/linpeilie/annotations/MapperConfig.java index a1218ef..82e1679 100644 --- a/mapstruct-plus/src/main/java/io/github/linpeilie/annotations/MapperConfig.java +++ b/mapstruct-plus/src/main/java/io/github/linpeilie/annotations/MapperConfig.java @@ -4,6 +4,8 @@ import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import org.mapstruct.Builder; +import org.mapstruct.ReportingPolicy; /** * 在一个类或者接口上添加该注释,作为自动生成 Mapper 的配置类。在一个模块中,只能有一个有该注释的类。 @@ -22,4 +24,22 @@ public @interface MapperConfig { */ String mapperPackage() default ""; + /** + * 当来源类中没有对应属性时的策略,默认忽略 + * @return {@link ReportingPolicy} + */ + ReportingPolicy unmappedSourcePolicy() default ReportingPolicy.IGNORE; + + /** + * 当来源类中没有对应属性时的策略,默认忽略 + * @return {@link ReportingPolicy} + */ + ReportingPolicy unmappedTargetPolicy() default ReportingPolicy.IGNORE; + + /** + * 构造者模式配置,由于 mapstruct 和 lombok 和 builder 一起使用时,会丢失父类属性,这里默认改为关闭 + * @return {@link Builder} + */ + Builder builder() default @Builder(disableBuilder = true); + } diff --git a/pom.xml b/pom.xml index 5d0898e..b0b96e2 100644 --- a/pom.xml +++ b/pom.xml @@ -17,7 +17,7 @@ - 1.1.8 + 1.1.9 17 17 UTF-8