From 7cf7132d1d06a209f87eab0b748c786ec09ffbb7 Mon Sep 17 00:00:00 2001 From: linpeilie Date: Thu, 14 Mar 2024 10:42:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=81=BF=E5=85=8D=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1=E5=BE=AA=E7=8E=AF=E5=B5=8C=E5=A5=97=E7=9A=84=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/github/linpeilie/model/Employee.java | 2 +- .../io/github/linpeilie/model/Product.java | 2 +- .../io/github/linpeilie/model/ProductDto.java | 2 +- .../linpeilie/model/ProductProperty.java | 2 +- .../linpeilie/model/ProductPropertyDto.java | 2 +- .../AbstractAdapterMapperGenerator.java | 16 ++++++++-------- .../processor/AutoMapperProcessor.java | 18 +++++++++--------- .../generator/AutoMapperGenerator.java | 6 +++--- .../processor/metadata/AutoMapperMetadata.java | 12 +++++------- .../linpeilie/annotations/AutoMapper.java | 9 ++++++--- 10 files changed, 36 insertions(+), 35 deletions(-) diff --git a/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/Employee.java b/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/Employee.java index 92d4546..804bf08 100644 --- a/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/Employee.java +++ b/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/Employee.java @@ -5,7 +5,7 @@ import java.util.List; import lombok.Data; @Data -@AutoMapper(target = EmployeeDto.class, cycles = true) +@AutoMapper(target = EmployeeDto.class, cycleAvoiding = true) public class Employee { private String name; diff --git a/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/Product.java b/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/Product.java index 590005a..fcd4eec 100644 --- a/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/Product.java +++ b/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/Product.java @@ -7,7 +7,7 @@ import lombok.EqualsAndHashCode; import lombok.ToString; @Data -@AutoMapper(target = ProductDto.class, cycles = true) +@AutoMapper(target = ProductDto.class, cycleAvoiding = true) public class Product { private Long id; diff --git a/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/ProductDto.java b/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/ProductDto.java index 53c4051..d3d238f 100644 --- a/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/ProductDto.java +++ b/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/ProductDto.java @@ -7,7 +7,7 @@ import lombok.EqualsAndHashCode; import lombok.ToString; @Data -@AutoMapper(target = Product.class, cycles = true) +@AutoMapper(target = Product.class, cycleAvoiding = true) public class ProductDto { private Long id; diff --git a/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/ProductProperty.java b/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/ProductProperty.java index d254959..1c95349 100644 --- a/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/ProductProperty.java +++ b/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/ProductProperty.java @@ -6,7 +6,7 @@ import lombok.EqualsAndHashCode; import lombok.ToString; @Data -@AutoMapper(target = ProductPropertyDto.class, cycles = true) +@AutoMapper(target = ProductPropertyDto.class, cycleAvoiding = true) public class ProductProperty { private Long id; diff --git a/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/ProductPropertyDto.java b/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/ProductPropertyDto.java index 79a0ed7..1797d31 100644 --- a/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/ProductPropertyDto.java +++ b/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/ProductPropertyDto.java @@ -6,7 +6,7 @@ import lombok.EqualsAndHashCode; import lombok.ToString; @Data -@AutoMapper(target = ProductProperty.class, cycles = true) +@AutoMapper(target = ProductProperty.class, cycleAvoiding = true) public class ProductPropertyDto { private Long id; 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 0e62e66..5715448 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 @@ -32,8 +32,8 @@ public abstract class AbstractAdapterMapperGenerator { public void write(ProcessingEnvironment processingEnv, Collection adapterMethods, String adapterClassName, - boolean cycle) { - write(processingEnv, createAdapterTypeSpec(adapterClassName, adapterMethods, cycle)); + boolean cycleAvoiding) { + write(processingEnv, createAdapterTypeSpec(adapterClassName, adapterMethods, cycleAvoiding)); } private void write(ProcessingEnvironment processingEnv, TypeSpec typeSpec) { @@ -55,17 +55,17 @@ public abstract class AbstractAdapterMapperGenerator { protected TypeSpec createAdapterTypeSpec(String adapterClassName, Collection adapterMethods, - boolean cycle) { + boolean cycleAvoiding) { List methods = adapterMethods.stream() - .filter(method -> !cycle || method.needCycleAvoiding()) - .map(method -> buildProxyMethod(method, cycle)) + .filter(method -> !cycleAvoiding || method.needCycleAvoiding()) + .map(method -> buildProxyMethod(method, cycleAvoiding)) .flatMap(Collection::stream) .collect(Collectors.toList()); if (methods.isEmpty()) { return null; } return createTypeSpec(methods, adapterClassName, - cycle ? ClassName.get(adapterPackage(), AutoMapperProperties.getAdapterClassName()) : null); + cycleAvoiding ? ClassName.get(adapterPackage(), AutoMapperProperties.getAdapterClassName()) : null); } protected TypeSpec createTypeSpec(List methods, String adapterClassName, ClassName superClass) { @@ -97,9 +97,9 @@ public abstract class AbstractAdapterMapperGenerator { return source; } - private List buildProxyMethod(AbstractAdapterMethodMetadata adapterMethod, boolean cycle) { + private List buildProxyMethod(AbstractAdapterMethodMetadata adapterMethod, boolean cycleAvoiding) { List methodSpecs = new ArrayList<>(); - if (cycle) { + if (cycleAvoiding) { methodSpecs.addAll(buildCycleAvoidingProxyMethod(adapterMethod)); } else { methodSpecs.addAll(buildDefaultProxyMethod(adapterMethod, null)); 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 9d95cf1..b98d605 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 @@ -540,12 +540,12 @@ public class AutoMapperProcessor extends AbstractProcessor { AutoMapperMetadata reverseMapperMetadata = initAutoMapperMetadata(autoMapperMetadata.getTargetClassName(), autoMapperMetadata.getSourceClassName(), - autoMapperMetadata.isCycles()); + autoMapperMetadata.isCycleAvoiding()); reverseMapperMetadata.setConvertGenerate(autoMapperMetadata.isReverseConvertGenerate()); reverseMapperMetadata.setUsesClassNameList(autoMapperMetadata.getUsesClassNameList()); reverseMapperMetadata.setImportsClassNameList(autoMapperMetadata.getImportsClassNameList()); - reverseMapperMetadata.setCycles(autoMapperMetadata.isCycles()); - if (reverseMapperMetadata.isCycles()) { + reverseMapperMetadata.setCycleAvoiding(autoMapperMetadata.isCycleAvoiding()); + if (reverseMapperMetadata.isCycleAvoiding()) { reverseMapperMetadata.setSuperClass(ClassName.get(ContextConstants.BaseCycleAvoidingMapper.packageName, ContextConstants.BaseCycleAvoidingMapper.className)); } else { @@ -588,7 +588,7 @@ public class AutoMapperProcessor extends AbstractProcessor { } AdapterMethodMetadata adapterMethodMetadata = AdapterMethodMetadata.newInstance(metadata.getSourceClassName(), metadata.getTargetClassName(), - metadata.mapperClass(), metadata.isCycles()); + metadata.mapperClass(), metadata.isCycleAvoiding()); methodMap.putIfAbsent(adapterMethodMetadata.getMethodName(), adapterMethodMetadata); } @@ -598,14 +598,14 @@ public class AutoMapperProcessor extends AbstractProcessor { mapMethodMap.putIfAbsent(adapterMapMethodMetadata.getMethodName(), adapterMapMethodMetadata); } - private AutoMapperMetadata initAutoMapperMetadata(ClassName source, ClassName target, boolean cycles) { + private AutoMapperMetadata initAutoMapperMetadata(ClassName source, ClassName target, boolean cycleAvoiding) { AutoMapperMetadata metadata = new AutoMapperMetadata(); metadata.setSourceClassName(source); metadata.setTargetClassName(target); metadata.setSuperGenerics(new ClassName[] {source, target}); ClassName mapStructConfigClass; - if (cycles) { + if (cycleAvoiding) { mapStructConfigClass = ClassName.get(AutoMapperProperties.getConfigPackage(), AutoMapperProperties.getCycleAvoidingConfigClassName()); } else { @@ -680,7 +680,7 @@ public class AutoMapperProcessor extends AbstractProcessor { List reverseMappingMetadataList = buildFieldReverseMappingMetadata((TypeElement) ele); reverseMappingMetadataList.removeIf(mappingMetadata -> !isTargetFieldMapping(target, mappingMetadata)); - AutoMapperMetadata metadata = initAutoMapperMetadata(source, target, autoMapper.cycles()); + AutoMapperMetadata metadata = initAutoMapperMetadata(source, target, autoMapper.cycleAvoiding()); metadata.setUsesClassNameList(uses); metadata.setImportsClassNameList(importsClassNameList); @@ -688,8 +688,8 @@ public class AutoMapperProcessor extends AbstractProcessor { metadata.setFieldReverseMappingList(reverseMappingMetadataList); metadata.setConvertGenerate(autoMapper.convertGenerate()); metadata.setReverseConvertGenerate(autoMapper.reverseConvertGenerate()); - metadata.setCycles(autoMapper.cycles()); - if (metadata.isCycles()) { + metadata.setCycleAvoiding(autoMapper.cycleAvoiding()); + if (metadata.isCycleAvoiding()) { metadata.setSuperClass(ClassName.get(ContextConstants.BaseCycleAvoidingMapper.packageName, ContextConstants.BaseCycleAvoidingMapper.className)); } else { diff --git a/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/generator/AutoMapperGenerator.java b/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/generator/AutoMapperGenerator.java index 9dda68c..31809c5 100644 --- a/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/generator/AutoMapperGenerator.java +++ b/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/generator/AutoMapperGenerator.java @@ -59,7 +59,7 @@ public class AutoMapperGenerator { .build(); if (metadata.getFieldMappingList() != null && !metadata.getFieldMappingList().isEmpty()) { builder.addMethod(addConvertMethodSpec( - metadata.isCycles() ? CollectionUtils.newArrayList(source, context) : Collections.singletonList(source), + metadata.isCycleAvoiding() ? CollectionUtils.newArrayList(source, context) : Collections.singletonList(source), metadata.getFieldMappingList(), targetClassName, CONVERT_METHOD_NAME)); @@ -69,13 +69,13 @@ public class AutoMapperGenerator { if (targetIsImmutable) { builder.addMethod( addEmptyConvertMethodForImmutableEntity( - metadata.isCycles() ? CollectionUtils.newArrayList(source, target, + metadata.isCycleAvoiding() ? CollectionUtils.newArrayList(source, target, context) : CollectionUtils.newArrayList(source, target), targetClassName, CONVERT_METHOD_NAME)); } else if (metadata.getFieldMappingList() != null && !metadata.getFieldMappingList().isEmpty()) { builder.addMethod(addConvertMethodSpec( - metadata.isCycles() ? CollectionUtils.newArrayList(source, target, + metadata.isCycleAvoiding() ? CollectionUtils.newArrayList(source, target, context) : CollectionUtils.newArrayList(source, target), metadata.getFieldMappingList(), targetClassName, diff --git a/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/metadata/AutoMapperMetadata.java b/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/metadata/AutoMapperMetadata.java index dc1a598..30ace3e 100644 --- a/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/metadata/AutoMapperMetadata.java +++ b/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/metadata/AutoMapperMetadata.java @@ -1,9 +1,7 @@ package io.github.linpeilie.processor.metadata; import com.squareup.javapoet.ClassName; -import io.github.linpeilie.processor.AutoMapperProperties; import java.util.List; -import org.mapstruct.ReportingPolicy; public class AutoMapperMetadata extends AbstractMapperMetadata { @@ -27,7 +25,7 @@ public class AutoMapperMetadata extends AbstractMapperMetadata { private boolean reverseConvertGenerate; - private boolean cycles; + private boolean cycleAvoiding; public String mapperName() { return sourceClassName.simpleName() + "To" + targetClassName.simpleName() + "Mapper"; @@ -116,11 +114,11 @@ public class AutoMapperMetadata extends AbstractMapperMetadata { this.convertGenerate = convertGenerate; } - public boolean isCycles() { - return cycles; + public boolean isCycleAvoiding() { + return cycleAvoiding; } - public void setCycles(boolean cycles) { - this.cycles = cycles; + public void setCycleAvoiding(boolean cycleAvoiding) { + this.cycleAvoiding = cycleAvoiding; } } diff --git a/mapstruct-plus/src/main/java/io/github/linpeilie/annotations/AutoMapper.java b/mapstruct-plus/src/main/java/io/github/linpeilie/annotations/AutoMapper.java index 8beae7b..fc2b90c 100644 --- a/mapstruct-plus/src/main/java/io/github/linpeilie/annotations/AutoMapper.java +++ b/mapstruct-plus/src/main/java/io/github/linpeilie/annotations/AutoMapper.java @@ -33,10 +33,13 @@ public @interface AutoMapper { boolean reverseConvertGenerate() default true; /** - * 是否有循环依赖对象 + * 是否需要避免对象循环嵌套 + *

+ * 循环嵌套:A中有属性类型B,B中有属性类型A,且可能对象之间互相引用 + *

* - * @return true: 有循环依赖对象 false: 没有循环依赖对象 + * @return true: 需要避免对象循环嵌套;false:不需要 */ - boolean cycles() default false; + boolean cycleAvoiding() default false; }