From a902e803fa2a383a498a26ac5dd0e9fac6d33ff0 Mon Sep 17 00:00:00 2001 From: linpeilie Date: Sat, 17 Jun 2023 00:54:14 +0800 Subject: [PATCH] =?UTF-8?q?release=201.3.1=20-=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E7=BC=96=E8=AF=91=E5=8F=82=E6=95=B0=E4=B8=AD=E6=8C=87=E5=AE=9A?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E7=B1=BB=E7=9A=84=E5=8A=9F=E8=83=BD=20-=20?= =?UTF-8?q?=E6=9B=B4=E5=A5=BD=E5=9C=B0=E9=80=82=E9=85=8D=20IDEA=20?= =?UTF-8?q?=E9=83=A8=E5=88=86=E7=BC=96=E8=AF=91=E5=9C=BA=E6=99=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- docs/README.md | 5 ++ docs/guide/configuration.md | 45 +++++++++++++-- docs/guide/faq.md | 2 +- docs/release/log.md | 5 ++ example/pom.xml | 2 +- .../AbstractAdapterMapperGenerator.java | 7 +++ .../processor/AutoMapperProcessor.java | 56 ++++++++++++------- .../linpeilie/processor/ProcessorOptions.java | 2 + .../generator/MapperConfigGenerator.java | 7 +++ pom.xml | 2 +- 11 files changed, 104 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 9e516c5..98718a9 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ public class User { ```xml - 1.2.5 + 1.3.1 diff --git a/docs/README.md b/docs/README.md index 76479cd..87db2ce 100644 --- a/docs/README.md +++ b/docs/README.md @@ -68,6 +68,11 @@ implementation group: 'io.github.linpeilie', name: 'mapstruct-plus-spring-boot-s ## 更新日志 +### 1.3.1 + +- 增加编译参数中指定配置类的功能 +- 更好地适配 IDEA 部分编译场景 + ### 1.3.0 - fix: 解决本地开发时 IDEA 编译或者运行时报错等与预期不一致的问题 diff --git a/docs/guide/configuration.md b/docs/guide/configuration.md index 207c113..dd9d126 100644 --- a/docs/guide/configuration.md +++ b/docs/guide/configuration.md @@ -23,6 +23,44 @@ public class MapStructPlusConfiguration { } ``` +:::warning +**当使用该方式配置时,强烈建议,在编译参数中,指定配置类为当前类,以解决IDEA部分编译场景时出现的各种问题,该功能从 1.3.1 开始支持** + +配置时,需要在启动参数中添加 `-Amapstruct.plus.mapperConfigClass` 参数,该参数的值为配置类的全路径名称: + +```xml + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + ${maven.compiler.source} + ${maven.compiler.target} + + + org.projectlombok + lombok + ${lombok.version} + + + io.github.linpeilie + mapstruct-plus-processor + ${mapstruct-plus.version} + + + org.projectlombok + lombok-mapstruct-binding + 0.2.0 + + + + -Amapstruct.plus.mapperConfigClass=com.tutelary.MapStructPlusConfiguration + + + +``` +::: + ------------------------------------------------------------------- 除此之外,配置属性还支持**增加编译参数**的方式,以 `-Akey=value` 的形式,传递给编译器。 @@ -31,10 +69,6 @@ public class MapStructPlusConfiguration { **且使用该方式配置优先级更高**,即,当该方式和配置类同时存在时,以该方式配置的属性为准。该功能从 `1.3.0` 开始支持。 -:::warning -**强烈!!!建议使用该方式来配置,因为本地开发时,修改类时,IDEA 会只对修改的类进行部分编译,无法获取到配置类,所以可能会出现与预想编译结果不同的问题,但执行 mvn clean package 又变为正常**。 -::: - 示例: ```xml @@ -65,8 +99,7 @@ public class MapStructPlusConfiguration { - -Amapstruct.plus.mapperPackage=com.tutelary.mapper - -Amapstruct.plus.adapterClassName=DemoConvertMapperAdapter1 + -Amapstruct.plus.adapterClassName=DemoConvertMapperAdapter -Amapstruct.plus.adapterPackage=io.github.linpeilie.adapter -Amapstruct.plus.mapAdapterClassName=DemoMapConvertMapperAdapter diff --git a/docs/guide/faq.md b/docs/guide/faq.md index 6faaab7..54281a4 100644 --- a/docs/guide/faq.md +++ b/docs/guide/faq.md @@ -139,4 +139,4 @@ dependencies { ## 本地开发时,修改类后启动报错,mvn clean compile 后又恢复正常 -该问题是由于 IDEA 部分编译导致没有找到配置类导致的,先更新 1.3.0,更换配置方式,详情可以查看[指南 - 配置](/guide/configuration.html) \ No newline at end of file +该问题是由于 IDEA 部分编译导致没有找到配置类导致的,先更新最新版本,更换配置方式,详情可以查看[指南 - 配置](/guide/configuration.html) \ No newline at end of file diff --git a/docs/release/log.md b/docs/release/log.md index 7b5c845..75e4883 100644 --- a/docs/release/log.md +++ b/docs/release/log.md @@ -6,6 +6,11 @@ category: description: MapStructPlus release log --- +### 1.3.1 + +- 增加编译参数中指定配置类的功能 +- 更好地适配 IDEA 部分编译场景 + ### 1.3.0 - fix: 解决本地开发时 IDEA 编译或者运行时报错等与预期不一致的问题 diff --git a/example/pom.xml b/example/pom.xml index cb0687a..0c1b64a 100644 --- a/example/pom.xml +++ b/example/pom.xml @@ -18,7 +18,7 @@ UTF-8 1.5.1.Final - 1.3.0 + 1.3.1 1.18.22 diff --git a/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/AbstractAdapterMapperGenerator.java b/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/AbstractAdapterMapperGenerator.java index 7225497..cae3ff7 100644 --- a/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/AbstractAdapterMapperGenerator.java +++ b/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/AbstractAdapterMapperGenerator.java @@ -14,6 +14,7 @@ import java.io.Writer; import java.util.Collection; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Modifier; +import javax.lang.model.element.TypeElement; import static javax.tools.Diagnostic.Kind.ERROR; @@ -22,6 +23,12 @@ public abstract class AbstractAdapterMapperGenerator { public void write(ProcessingEnvironment processingEnv, Collection adapterMethods, String adapterClassName) { + final TypeElement typeElement = + processingEnv.getElementUtils().getTypeElement(adapterPackage() + "." + adapterClassName); + if (typeElement != null) { + System.out.println("adapter class existed"); + return; + } // write Adapter try (final Writer writer = processingEnv.getFiler() .createSourceFile(adapterPackage() + "." + adapterClassName) 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 2d146df..4a345c9 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 @@ -72,6 +72,7 @@ import static io.github.linpeilie.processor.ProcessorOptions.*; AUTO_ENUM_MAPPER_ANNOTATION, MAPPER_CONFIG_ANNOTATION, COMPONENT_MODEL_CONFIG_ANNOTATION, MAPPER_ANNOTATION}) @SupportedOptions({ + MAPPER_CONFIG_CLASS, MAPPER_PACKAGE, UNMAPPED_SOURCE_POLICY, UNMAPPED_TARGET_POLICY, @@ -310,33 +311,46 @@ public class AutoMapperProcessor extends AbstractProcessor { AutoMapperProperties.getMapAdapterClassName(), null); } + private void loadMapperConfig(MapperConfig mapperConfig) { + if (mapperConfig == null) { + return; + } + AutoMapperProperties.setUnmappedSourcePolicy(mapperConfig.unmappedSourcePolicy()); + AutoMapperProperties.setUnmappedTargetPolicy(mapperConfig.unmappedTargetPolicy()); + AutoMapperProperties.setNullValueMappingStrategy(mapperConfig.nullValueMappingStrategy()); + AutoMapperProperties.setNullValuePropertyMappingStrategy(mapperConfig.nullValuePropertyMappingStrategy()); + AutoMapperProperties.setBuildMethod(mapperConfig.builder().buildMethod()); + AutoMapperProperties.setDisableBuilder(mapperConfig.builder().disableBuilder()); + if (StrUtil.isNotEmpty(mapperConfig.mapperPackage())) { + AutoMapperProperties.setMapperPackage(mapperConfig.mapperPackage()); + } + if (StrUtil.isNotEmpty(mapperConfig.adapterPackage())) { + AutoMapperProperties.setAdapterPackage(mapperConfig.adapterPackage()); + } + if (StrUtil.isNotEmpty(mapperConfig.adapterClassName())) { + AutoMapperProperties.setAdapterClassName(mapperConfig.adapterClassName()); + } + if (StrUtil.isNotEmpty(mapperConfig.mapAdapterClassName())) { + AutoMapperProperties.setMapAdapterClassName(mapperConfig.mapAdapterClassName()); + } + } + private void refreshProperties(final Set annotations, final RoundEnvironment roundEnv) { // annotation --> MapperConfig annotations.stream() .filter(this::isMapperConfigAnnotation) .findFirst() .flatMap(annotation -> roundEnv.getElementsAnnotatedWith(annotation).stream().findFirst()) - .ifPresent(element -> { - final MapperConfig mapperConfig = element.getAnnotation(MapperConfig.class); - AutoMapperProperties.setUnmappedSourcePolicy(mapperConfig.unmappedSourcePolicy()); - AutoMapperProperties.setUnmappedTargetPolicy(mapperConfig.unmappedTargetPolicy()); - AutoMapperProperties.setNullValueMappingStrategy(mapperConfig.nullValueMappingStrategy()); - AutoMapperProperties.setNullValuePropertyMappingStrategy(mapperConfig.nullValuePropertyMappingStrategy()); - AutoMapperProperties.setBuildMethod(mapperConfig.builder().buildMethod()); - AutoMapperProperties.setDisableBuilder(mapperConfig.builder().disableBuilder()); - if (StrUtil.isNotEmpty(mapperConfig.mapperPackage())) { - AutoMapperProperties.setMapperPackage(mapperConfig.mapperPackage()); - } - if (StrUtil.isNotEmpty(mapperConfig.adapterPackage())) { - AutoMapperProperties.setAdapterPackage(mapperConfig.adapterPackage()); - } - if (StrUtil.isNotEmpty(mapperConfig.adapterClassName())) { - AutoMapperProperties.setAdapterClassName(mapperConfig.adapterClassName()); - } - if (StrUtil.isNotEmpty(mapperConfig.mapAdapterClassName())) { - AutoMapperProperties.setMapAdapterClassName(mapperConfig.mapAdapterClassName()); - } - }); + .ifPresent(element -> loadMapperConfig(element.getAnnotation(MapperConfig.class))); + + // special MapperConfig Class + final String mapperConfigClass = processingEnv.getOptions().get(MAPPER_CONFIG_CLASS); + if (StrUtil.isNotEmpty(mapperConfigClass)) { + final TypeElement typeElement = processingEnv.getElementUtils().getTypeElement(mapperConfigClass); + if (typeElement != null) { + loadMapperConfig(typeElement.getAnnotation(MapperConfig.class)); + } + } // annotation --> ComponentModelConfig annotations.stream() diff --git a/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/ProcessorOptions.java b/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/ProcessorOptions.java index 55e6df7..d19e226 100644 --- a/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/ProcessorOptions.java +++ b/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/ProcessorOptions.java @@ -9,6 +9,8 @@ import org.mapstruct.ReportingPolicy; public class ProcessorOptions { + public static final String MAPPER_CONFIG_CLASS = "mapstruct.plus.mapperConfigClass"; + public static final String DEFAULT_COMPONENT_MODEL = "mapstruct.defaultComponentModel"; public static final String MAPPER_PACKAGE = "mapstruct.plus.mapperPackage"; 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 9d53cd9..fe192aa 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 @@ -12,6 +12,7 @@ import java.io.Writer; import java.util.List; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Modifier; +import javax.lang.model.element.TypeElement; import javax.lang.model.type.TypeMirror; import static javax.tools.Diagnostic.Kind.ERROR; @@ -19,6 +20,12 @@ import static javax.tools.Diagnostic.Kind.ERROR; public class MapperConfigGenerator { public void write(ProcessingEnvironment processingEnv, String mapstructConfigName, String adapterClassName, List uses) { + final TypeElement typeElement = + processingEnv.getElementUtils().getTypeElement(AutoMapperProperties.getConfigPackage() + "." + adapterClassName); + if (typeElement != null) { + System.out.println("mapperConfig class existed"); + return; + } try (final Writer writer = processingEnv.getFiler() .createSourceFile(AutoMapperProperties.getConfigPackage() + "." + mapstructConfigName) .openWriter()) { diff --git a/pom.xml b/pom.xml index 9498bf8..50d5ad8 100644 --- a/pom.xml +++ b/pom.xml @@ -17,7 +17,7 @@ - 1.3.0 + 1.3.1 8 8 UTF-8