From 34fa59d985b6298b19a066c0818c097ee77b5bea Mon Sep 17 00:00:00 2001 From: linpeilie Date: Mon, 24 Apr 2023 16:18:25 +0800 Subject: [PATCH] =?UTF-8?q?1.2.3=20-=20MapStructPlus=20=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E7=94=B1=201.5.3.Final=20=E5=8D=87=E7=BA=A7=E4=B8=BA=201.5.5.F?= =?UTF-8?q?inal=20-=20=E5=A2=9E=E5=8A=A0=E8=87=AA=E5=AE=9A=E4=B9=89=20Conv?= =?UTF-8?q?ertMapperAdapter=20=E5=92=8C=20MapConvertMapperAdapter=20?= =?UTF-8?q?=E7=B1=BB=E5=90=8D=E5=92=8C=E5=8C=85=E5=90=8D=E7=9A=84=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=20-=20=E7=94=9F=E6=88=90=E7=9A=84=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=EF=BC=8C=E8=87=AA=E5=8A=A8=E6=8E=A5=E5=85=A5?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E8=BD=AC=E6=8D=A2=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 9 +- docs/guide/class-convert.md | 134 ++++++++++++++++++ docs/guide/configuration.md | 86 +++++++++++ docs/guide/faq.md | 2 +- docs/release/log.md | 6 + example/pom.xml | 2 +- .../linpeilie/MapStructPlusConfiguration.java | 9 ++ .../github/linpeilie/mapper/TyreMapper.java | 15 ++ .../java/io/github/linpeilie/model/Car.java | 1 + .../io/github/linpeilie/model/CarDto.java | 1 + .../java/io/github/linpeilie/model/Tyre.java | 4 + .../io/github/linpeilie/model/TyreDTO.java | 4 + .../processor/AutoMapperProcessor.java | 38 ++++- .../processor/AutoMapperProperties.java | 24 +++- .../github/linpeilie/processor/Constants.java | 2 + .../generator/MapperConfigGenerator.java | 23 ++- .../linpeilie/annotations/MapperConfig.java | 20 ++- pom.xml | 4 +- 18 files changed, 358 insertions(+), 26 deletions(-) create mode 100644 docs/guide/configuration.md create mode 100644 example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/MapStructPlusConfiguration.java create mode 100644 example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/mapper/TyreMapper.java create mode 100644 example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/Tyre.java create mode 100644 example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/TyreDTO.java diff --git a/docs/README.md b/docs/README.md index da3711e..a3f0798 100644 --- a/docs/README.md +++ b/docs/README.md @@ -50,7 +50,7 @@ copyright: false io.github.linpeilie mapstruct-plus-spring-boot-starter - 1.2.2 + 1.2.3 ``` @@ -62,10 +62,11 @@ implementation group: 'io.github.linpeilie', name: 'mapstruct-plus-spring-boot-s ## 更新日志 -### 1.2.2 +### 1.2.3 -- fixbug: 定义多个uses时的问题 -- feature: 增加 `@AutoEnumMapper` 注解,可以在类型转换时,自动转换枚举 +- MapStructPlus 版本由 `1.5.3.Final` 升级为 `1.5.5.Final` +- 增加自定义 `ConvertMapperAdapter` 和 `MapConvertMapperAdapter` 类名和包名的功能 +- 生成的转换接口,自动接入自定义转换接口 …… diff --git a/docs/guide/class-convert.md b/docs/guide/class-convert.md index 3b0acb9..e63e758 100644 --- a/docs/guide/class-convert.md +++ b/docs/guide/class-convert.md @@ -349,6 +349,140 @@ public class User { } ``` +## 自动接入自定义转换接口 + +::: info +since `1.2.3` +::: + +当有的类型转换逻辑比较复杂,可以通过自定义转换接口来实现,即使用 MapStruct 原生的方式。 + +当使用这种方式时,默认生成的类型转换中,如果有前面提供的类型转换时,会自动引用。 + +例如: + +::: code-tabs#java + +@tab Car + +```java +@AutoMapper(target = CarDto.class) +@Data +public class Car { + private Tyre tyre; +} +``` + +@tab CarDto + +```java +@Data +public class CarDto { + private TyreDTO tyre; +} +``` + +::: + +这里定义 `Tyre` 和 `TyreDTO` 之间的转换接口: + +```java +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface TyreMapper { + + TyreDTO tyreToTyreDTO(Tyre tyre); + + Tyre tyreDtoToTyre(TyreDTO tyreDTO); + +} +``` + +生成的 `Car` 与 `CarDto` 转换接口的实现类如下: + +::: code-tabs#java + +@tab CarToCarDtoMapperImpl + +```java +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2023-04-24T15:38:48+0800", + comments = "version: 1.5.5.Final, compiler: javac, environment: Java 1.8.0_202 (Oracle Corporation)" +) +@Component +public class CarToCarDtoMapperImpl implements CarToCarDtoMapper { + + @Autowired + private TyreMapper tyreMapper; + + @Override + public CarDto convert(Car source) { + if ( source == null ) { + return null; + } + + CarDto carDto = new CarDto(); + + carDto.setTyre( tyreMapper.tyreToTyreDTO( source.getTyre() ) ); + + return carDto; + } + + @Override + public CarDto convert(Car source, CarDto target) { + if ( source == null ) { + return target; + } + + target.setTyre( tyreMapper.tyreToTyreDTO( source.getTyre() ) ); + + return target; + } +} +``` + +@tab CarDtoToCarMapperImpl + +```java +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2023-04-24T15:38:49+0800", + comments = "version: 1.5.5.Final, compiler: javac, environment: Java 1.8.0_202 (Oracle Corporation)" +) +@Component +public class CarDtoToCarMapperImpl implements CarDtoToCarMapper { + + @Autowired + private TyreMapper tyreMapper; + + @Override + public Car convert(CarDto source) { + if ( source == null ) { + return null; + } + + Car car = new Car(); + + car.setTyre( tyreMapper.tyreDtoToTyre( source.getTyre() ) ); + + return car; + } + + @Override + public Car convert(CarDto source, Car target) { + if ( source == null ) { + return target; + } + + target.setTyre( tyreMapper.tyreDtoToTyre( source.getTyre() ) ); + + return target; + } +} +``` +::: + + ## 反向属性映射配置 ::: info diff --git a/docs/guide/configuration.md b/docs/guide/configuration.md new file mode 100644 index 0000000..cdc6f37 --- /dev/null +++ b/docs/guide/configuration.md @@ -0,0 +1,86 @@ +--- +title: 配置项 +order: 6 +category: +- 指南 +description: MapStructPlus MapStructPlus配置项 configuration +--- + +MapStructPlus 提供了多个配置项,来指定生成转换接口时的一些行为。 + +## 使用方式 + +在需要进行配置的模块中,新建配置类,在该类上面增加注解:`@MapperConfig`,在一个模块中,只能有一个有该注解的类。 + +例如: + +```java +@MapperConfig(adapterClassName = "DemoConvertMapperAdapter", + adapterPackage = "io.github.linpeilie.adapter", + mapAdapterClassName = "DemoMapConvertMapperAdapter") +public class MapStructPlusConfiguration { +} +``` + +## 配置项 + +### mapperPackage + +- **说明**:生成的 Mapper 转换接口的包名 +- **类型**:`String` +- **默认值**:默认生成在要转换的类同包名下 + +### unmappedSourcePolicy + +- **说明**:当来源类中没有对应属性时的策略,默认忽略 +- **类型**:`ReportingPolicy` +- **可选项**: + - `IGNORE`:忽略 + - `WARN`:打印警告日志 + - `ERROR`:抛出异常 +- **默认值**:`IGNORE` + +### unmappedTargetPolicy + +- **说明**:当目标类中没有对应属性时的策略,默认忽略 +- **类型**:`ReportingPolicy` +- **可选项**: + - `IGNORE`:忽略 + - `WARN`:打印警告日志 + - `ERROR`:抛出异常 +- **默认值**:`IGNORE` + +### builder + +- **说明**:构造者模式配置,MapStruct 与 lombok 的 builder 一起使用时,会丢失父类属性,所以这里将默认使用构造者模式关闭 +- **类型**:`Builder` +- **支持配置项**: + - `buildMethod`:构造器创建要构建类型时的构造方法 + - `disableBuilder`:打开/关闭构造器,如果关闭,则只使用常规的 getters/setters +- **默认值**: + - `buildMethod`:`build` + - `disableBuilder`:`true` + +### adapterPackage + +> since `1.2.3` + +- **说明**:ConvertAdapterClass 和 MapConvertMapperAdapter 的包名 +- **类型**:`String` +- **默认值**:io.github.linpeilie + +### adapterClassName + +> since `1.2.3` + +- **说明**:ConvertAdapterClass 类名 +- **类型**:`String` +- **默认值**:ConvertMapperAdapter + +### mapAdapterClassName + +> since `1.2.3` + +- **说明**:MapConvertMapperAdapter 类名 +- **类型**:`String` +- **默认值**:MapConvertMapperAdapter \ No newline at end of file diff --git a/docs/guide/faq.md b/docs/guide/faq.md index 058db21..a8b6690 100644 --- a/docs/guide/faq.md +++ b/docs/guide/faq.md @@ -1,6 +1,6 @@ --- title: 常见问题 -order: 6 +order: 7 category: - 指南 description: MapStructPlus MapStructPlus常见问题 faq diff --git a/docs/release/log.md b/docs/release/log.md index f6d357d..23ec805 100644 --- a/docs/release/log.md +++ b/docs/release/log.md @@ -6,6 +6,12 @@ category: description: MapStructPlus release log --- +### 1.2.3 + +- MapStructPlus 版本由 `1.5.3.Final` 升级为 `1.5.5.Final` +- 增加自定义 `ConvertMapperAdapter` 和 `MapConvertMapperAdapter` 类名和包名的功能 +- 生成的转换接口,自动接入自定义转换接口,具体[详见](/guide/class-convert.html#自动接入自定义转换接口) + ### 1.2.2 - fixbug: 定义多个uses时的问题 diff --git a/example/pom.xml b/example/pom.xml index 35bafa3..7b5c8f1 100644 --- a/example/pom.xml +++ b/example/pom.xml @@ -18,7 +18,7 @@ UTF-8 1.5.1.Final - 1.2.2 + 1.2.3 1.18.22 diff --git a/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/MapStructPlusConfiguration.java b/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/MapStructPlusConfiguration.java new file mode 100644 index 0000000..f9f67ea --- /dev/null +++ b/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/MapStructPlusConfiguration.java @@ -0,0 +1,9 @@ +package io.github.linpeilie; + +import io.github.linpeilie.annotations.MapperConfig; + +@MapperConfig(adapterClassName = "DemoConvertMapperAdapter", + adapterPackage = "io.github.linpeilie.adapter", + mapAdapterClassName = "DemoMapConvertMapperAdapter") +public class MapStructPlusConfiguration { +} diff --git a/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/mapper/TyreMapper.java b/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/mapper/TyreMapper.java new file mode 100644 index 0000000..15e197f --- /dev/null +++ b/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/mapper/TyreMapper.java @@ -0,0 +1,15 @@ +package io.github.linpeilie.mapper; + +import io.github.linpeilie.model.Tyre; +import io.github.linpeilie.model.TyreDTO; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; + +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface TyreMapper { + + TyreDTO tyreToTyreDTO(Tyre tyre); + + Tyre tyreDtoToTyre(TyreDTO tyreDTO); + +} diff --git a/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/Car.java b/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/Car.java index 594b973..43ba101 100644 --- a/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/Car.java +++ b/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/Car.java @@ -11,6 +11,7 @@ public class Car { private String make; private SeatConfiguration seatConfiguration; private CarType type; + private Tyre tyre; @AutoMapping(target = "wheels", ignore = true) private Wheels wheels; diff --git a/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/CarDto.java b/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/CarDto.java index ff78cf0..b7bd6f1 100644 --- a/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/CarDto.java +++ b/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/CarDto.java @@ -9,5 +9,6 @@ public class CarDto { private SeatConfigurationDto seatConfiguration; private String type; private List wheels; + private TyreDTO tyre; } diff --git a/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/Tyre.java b/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/Tyre.java new file mode 100644 index 0000000..bb7a1f5 --- /dev/null +++ b/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/Tyre.java @@ -0,0 +1,4 @@ +package io.github.linpeilie.model; + +public class Tyre { +} diff --git a/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/TyreDTO.java b/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/TyreDTO.java new file mode 100644 index 0000000..537fad0 --- /dev/null +++ b/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/TyreDTO.java @@ -0,0 +1,4 @@ +package io.github.linpeilie.model; + +public class TyreDTO { +} 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 15936b3..529f66c 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 @@ -29,7 +29,6 @@ import io.github.linpeilie.processor.metadata.AutoMapperMetadata; import io.github.linpeilie.processor.metadata.AutoMappingMetadata; import java.io.IOException; import java.io.Writer; -import java.lang.annotation.ElementType; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -44,12 +43,10 @@ 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.ExecutableElement; -import javax.lang.model.element.Name; import javax.lang.model.element.TypeElement; import javax.lang.model.type.MirroredTypeException; import javax.lang.model.type.MirroredTypesException; @@ -57,18 +54,19 @@ import javax.lang.model.type.TypeMirror; import javax.tools.Diagnostic; import org.apache.commons.lang3.StringUtils; import org.mapstruct.MappingConstants; -import org.mapstruct.ReportingPolicy; import static io.github.linpeilie.processor.Constants.AUTO_ENUM_MAPPER_ANNOTATION; import static io.github.linpeilie.processor.Constants.AUTO_MAPPERS_ANNOTATION; import static io.github.linpeilie.processor.Constants.AUTO_MAPPER_ANNOTATION; import static io.github.linpeilie.processor.Constants.AUTO_MAP_MAPPER_ANNOTATION; import static io.github.linpeilie.processor.Constants.COMPONENT_MODEL_CONFIG_ANNOTATION; +import static io.github.linpeilie.processor.Constants.MAPPER_ANNOTATION; import static io.github.linpeilie.processor.Constants.MAPPER_CONFIG_ANNOTATION; import static javax.tools.Diagnostic.Kind.ERROR; @SupportedAnnotationTypes({AUTO_MAPPER_ANNOTATION, AUTO_MAPPERS_ANNOTATION, AUTO_MAP_MAPPER_ANNOTATION, - AUTO_ENUM_MAPPER_ANNOTATION, MAPPER_CONFIG_ANNOTATION, COMPONENT_MODEL_CONFIG_ANNOTATION}) + AUTO_ENUM_MAPPER_ANNOTATION, MAPPER_CONFIG_ANNOTATION, COMPONENT_MODEL_CONFIG_ANNOTATION, + MAPPER_ANNOTATION}) public class AutoMapperProcessor extends AbstractProcessor { private static final ClassName MAPPING_DEFAULT_TARGET = ClassName.get("io.github.linpeilie", "DefaultMapping"); @@ -85,6 +83,8 @@ public class AutoMapperProcessor extends AbstractProcessor { private final List mapperList = new ArrayList<>(); + private final List customMapperList = new ArrayList<>(); + private final Set mapperSet = new HashSet<>(); public AutoMapperProcessor() { @@ -112,6 +112,10 @@ public class AutoMapperProcessor extends AbstractProcessor { return MAPPER_CONFIG_ANNOTATION.contentEquals(annotation.getQualifiedName()); } + private boolean isMapperAnnotation(TypeElement annotation) { + return MAPPER_ANNOTATION.contentEquals(annotation.getQualifiedName()); + } + private boolean isComponentModelConfigAnnotation(TypeElement annotation) { return COMPONENT_MODEL_CONFIG_ANNOTATION.contentEquals(annotation.getQualifiedName()); } @@ -156,12 +160,23 @@ public class AutoMapperProcessor extends AbstractProcessor { .findFirst() .ifPresent(annotation -> processAutoMappersAnnotation(roundEnv, annotation)); + // custom mapper + annotations.stream() + .filter(this::isMapperAnnotation) + .findFirst() + .ifPresent(annotation -> processMapperAnnotation(roundEnv, annotation)); + // 生成类 generateMapper(); return false; } + private void processMapperAnnotation(final RoundEnvironment roundEnv, final TypeElement annotation) { + roundEnv.getElementsAnnotatedWith(annotation) + .forEach(element -> customMapperList.add(element.asType())); + } + private void processAutoEnumMapperAnnotation(final RoundEnvironment roundEnv, final TypeElement annotation) { roundEnv.getElementsAnnotatedWith(annotation) .stream() @@ -268,7 +283,7 @@ public class AutoMapperProcessor extends AbstractProcessor { AutoMapperProperties.getMapAdapterClassName()); mapperConfigGenerator.write(processingEnv, AutoMapperProperties.getMapConfigClassName(), - AutoMapperProperties.getMapAdapterClassName()); + AutoMapperProperties.getMapAdapterClassName(), null); } private void refreshProperties(final Set annotations, final RoundEnvironment roundEnv) { @@ -286,6 +301,15 @@ public class AutoMapperProcessor extends AbstractProcessor { AutoMapperProperties.setUnmappedTargetPolicy(mapperConfig.unmappedTargetPolicy()); AutoMapperProperties.setBuildMethod(mapperConfig.builder().buildMethod()); AutoMapperProperties.setDisableBuilder(mapperConfig.builder().disableBuilder()); + 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()); + } }); annotations.stream() .filter(this::isComponentModelConfigAnnotation) @@ -355,7 +379,7 @@ public class AutoMapperProcessor extends AbstractProcessor { adapterMapperGenerator.write(processingEnv, methodMap.values(), AutoMapperProperties.getAdapterClassName()); mapperConfigGenerator.write(processingEnv, AutoMapperProperties.getConfigClassName(), - AutoMapperProperties.getAdapterClassName()); + AutoMapperProperties.getAdapterClassName(), customMapperList); } private AutoMapperMetadata reverseMapper(AutoMapperMetadata autoMapperMetadata) { 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 8302a4b..7384b1b 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 @@ -19,20 +19,38 @@ public class AutoMapperProperties { private static boolean disableBuilder = true; + private static String adapterPackage = DEFAULT_BASE_PACKAGE; + + private static String adapterClassName = DEFAULT_ADAPTER_CLASS_NAME; + + private static String mapAdapterClassName = DEFAULT_MAP_ADAPTER_CLASS_NAME; + public static String getMapperPackage() { return mapperPackage; } public static String getAdapterPackage() { - return DEFAULT_BASE_PACKAGE; + return adapterPackage; + } + + public static void setAdapterPackage(final String adapterPackage) { + AutoMapperProperties.adapterPackage = adapterPackage; } public static String getAdapterClassName() { - return DEFAULT_ADAPTER_CLASS_NAME; + return adapterClassName; + } + + public static void setAdapterClassName(final String adapterClassName) { + AutoMapperProperties.adapterClassName = adapterClassName; } public static String getMapAdapterClassName() { - return DEFAULT_MAP_ADAPTER_CLASS_NAME; + return mapAdapterClassName; + } + + public static void setMapAdapterClassName(final String mapAdapterClassName) { + AutoMapperProperties.mapAdapterClassName = mapAdapterClassName; } public static String getConfigPackage() { diff --git a/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/Constants.java b/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/Constants.java index cfd29a5..f45493a 100644 --- a/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/Constants.java +++ b/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/Constants.java @@ -26,6 +26,8 @@ public class Constants { public static final String MAPPER_CONFIG_ANNOTATION = "io.github.linpeilie.annotations.MapperConfig"; + public static final String MAPPER_ANNOTATION = "org.mapstruct.Mapper"; + public static final String COMPONENT_MODEL_CONFIG_ANNOTATION = "io.github.linpeilie.annotations.ComponentModelConfig"; public static final String BASE_MAPPER_PACKAGE = "io.github.linpeilie"; 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 8b9376b..8fe0378 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 @@ -1,5 +1,6 @@ package io.github.linpeilie.processor.generator; +import cn.hutool.core.collection.CollectionUtil; import com.squareup.javapoet.AnnotationSpec; import com.squareup.javapoet.ClassName; import com.squareup.javapoet.CodeBlock; @@ -8,18 +9,20 @@ import com.squareup.javapoet.TypeSpec; import io.github.linpeilie.processor.AutoMapperProperties; import java.io.IOException; import java.io.Writer; +import java.util.List; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Modifier; +import javax.lang.model.type.TypeMirror; import static javax.tools.Diagnostic.Kind.ERROR; public class MapperConfigGenerator { - public void write(ProcessingEnvironment processingEnv, String mapstructConfigName, String adapterClassName) { + public void write(ProcessingEnvironment processingEnv, String mapstructConfigName, String adapterClassName, List uses) { try (final Writer writer = processingEnv.getFiler() .createSourceFile(AutoMapperProperties.getConfigPackage() + "." + mapstructConfigName) .openWriter()) { - JavaFile.builder(AutoMapperProperties.getConfigPackage(), createConfigTypeSpec(mapstructConfigName, adapterClassName)).build().writeTo(writer); + JavaFile.builder(AutoMapperProperties.getConfigPackage(), createConfigTypeSpec(mapstructConfigName, adapterClassName, uses)).build().writeTo(writer); } catch (IOException e) { processingEnv.getMessager() .printMessage(ERROR, @@ -28,17 +31,23 @@ public class MapperConfigGenerator { } } - private TypeSpec createConfigTypeSpec(final String mapstructConfigName, final String adapterClassName) { + private TypeSpec createConfigTypeSpec(final String mapstructConfigName, + final String adapterClassName, + final List uses) { return TypeSpec.interfaceBuilder(mapstructConfigName) .addModifiers(Modifier.PUBLIC) - .addAnnotation(buildMapperConfigAnnotationSpec(adapterClassName)) + .addAnnotation(buildMapperConfigAnnotationSpec(adapterClassName, uses)) .build(); } - private AnnotationSpec buildMapperConfigAnnotationSpec(final String adapterClassName) { + private AnnotationSpec buildMapperConfigAnnotationSpec(final String adapterClassName, final List uses) { CodeBlock.Builder usesCodeBuilder = CodeBlock.builder().add("{"); - usesCodeBuilder.add("$T.class", - ClassName.get(AutoMapperProperties.getAdapterPackage(), adapterClassName)); + usesCodeBuilder.add("$T.class", ClassName.get(AutoMapperProperties.getAdapterPackage(), adapterClassName)); + if (CollectionUtil.isNotEmpty(uses)) { + uses.forEach(use -> { + usesCodeBuilder.add(", $T.class", use); + }); + } CodeBlock usesCodeBlock = usesCodeBuilder.add("}").build(); final AnnotationSpec.Builder builder = AnnotationSpec.builder(ClassName.get("org.mapstruct", "MapperConfig")) .addMember("componentModel", 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 82e1679..778411c 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 @@ -31,7 +31,7 @@ public @interface MapperConfig { ReportingPolicy unmappedSourcePolicy() default ReportingPolicy.IGNORE; /** - * 当来源类中没有对应属性时的策略,默认忽略 + * 当目标类中没有对应属性时的策略,默认忽略 * @return {@link ReportingPolicy} */ ReportingPolicy unmappedTargetPolicy() default ReportingPolicy.IGNORE; @@ -42,4 +42,22 @@ public @interface MapperConfig { */ Builder builder() default @Builder(disableBuilder = true); + /** + * 默认包名为:io.github.linpeilie + * @return ConvertAdapterClass 包名 + */ + String adapterPackage() default ""; + + /** + * 默认类名为:ConvertMapperAdapter + * @return ConvertAdapterClass 类名 + */ + String adapterClassName() default ""; + + /** + * 默认类名为:MapConvertMapperAdapter + * @return MapConvertAdapterClass 类名 + */ + String mapAdapterClassName() default ""; + } diff --git a/pom.xml b/pom.xml index ef18705..194e9d6 100644 --- a/pom.xml +++ b/pom.xml @@ -17,11 +17,11 @@ - 1.2.2 + 1.2.3 8 8 UTF-8 - 1.5.3.Final + 1.5.5.Final 5.8.15 https://github.com/linpeilie/mapstruct-plus.git