修改避免对象循环嵌套的属性名称

This commit is contained in:
linpeilie 2024-03-14 10:42:47 +08:00
parent d34c417681
commit 7cf7132d1d
10 changed files with 36 additions and 35 deletions

View File

@ -5,7 +5,7 @@ import java.util.List;
import lombok.Data; import lombok.Data;
@Data @Data
@AutoMapper(target = EmployeeDto.class, cycles = true) @AutoMapper(target = EmployeeDto.class, cycleAvoiding = true)
public class Employee { public class Employee {
private String name; private String name;

View File

@ -7,7 +7,7 @@ import lombok.EqualsAndHashCode;
import lombok.ToString; import lombok.ToString;
@Data @Data
@AutoMapper(target = ProductDto.class, cycles = true) @AutoMapper(target = ProductDto.class, cycleAvoiding = true)
public class Product { public class Product {
private Long id; private Long id;

View File

@ -7,7 +7,7 @@ import lombok.EqualsAndHashCode;
import lombok.ToString; import lombok.ToString;
@Data @Data
@AutoMapper(target = Product.class, cycles = true) @AutoMapper(target = Product.class, cycleAvoiding = true)
public class ProductDto { public class ProductDto {
private Long id; private Long id;

View File

@ -6,7 +6,7 @@ import lombok.EqualsAndHashCode;
import lombok.ToString; import lombok.ToString;
@Data @Data
@AutoMapper(target = ProductPropertyDto.class, cycles = true) @AutoMapper(target = ProductPropertyDto.class, cycleAvoiding = true)
public class ProductProperty { public class ProductProperty {
private Long id; private Long id;

View File

@ -6,7 +6,7 @@ import lombok.EqualsAndHashCode;
import lombok.ToString; import lombok.ToString;
@Data @Data
@AutoMapper(target = ProductProperty.class, cycles = true) @AutoMapper(target = ProductProperty.class, cycleAvoiding = true)
public class ProductPropertyDto { public class ProductPropertyDto {
private Long id; private Long id;

View File

@ -32,8 +32,8 @@ public abstract class AbstractAdapterMapperGenerator {
public void write(ProcessingEnvironment processingEnv, public void write(ProcessingEnvironment processingEnv,
Collection<AbstractAdapterMethodMetadata> adapterMethods, Collection<AbstractAdapterMethodMetadata> adapterMethods,
String adapterClassName, String adapterClassName,
boolean cycle) { boolean cycleAvoiding) {
write(processingEnv, createAdapterTypeSpec(adapterClassName, adapterMethods, cycle)); write(processingEnv, createAdapterTypeSpec(adapterClassName, adapterMethods, cycleAvoiding));
} }
private void write(ProcessingEnvironment processingEnv, TypeSpec typeSpec) { private void write(ProcessingEnvironment processingEnv, TypeSpec typeSpec) {
@ -55,17 +55,17 @@ public abstract class AbstractAdapterMapperGenerator {
protected TypeSpec createAdapterTypeSpec(String adapterClassName, protected TypeSpec createAdapterTypeSpec(String adapterClassName,
Collection<AbstractAdapterMethodMetadata> adapterMethods, Collection<AbstractAdapterMethodMetadata> adapterMethods,
boolean cycle) { boolean cycleAvoiding) {
List<MethodSpec> methods = adapterMethods.stream() List<MethodSpec> methods = adapterMethods.stream()
.filter(method -> !cycle || method.needCycleAvoiding()) .filter(method -> !cycleAvoiding || method.needCycleAvoiding())
.map(method -> buildProxyMethod(method, cycle)) .map(method -> buildProxyMethod(method, cycleAvoiding))
.flatMap(Collection::stream) .flatMap(Collection::stream)
.collect(Collectors.toList()); .collect(Collectors.toList());
if (methods.isEmpty()) { if (methods.isEmpty()) {
return null; return null;
} }
return createTypeSpec(methods, adapterClassName, return createTypeSpec(methods, adapterClassName,
cycle ? ClassName.get(adapterPackage(), AutoMapperProperties.getAdapterClassName()) : null); cycleAvoiding ? ClassName.get(adapterPackage(), AutoMapperProperties.getAdapterClassName()) : null);
} }
protected TypeSpec createTypeSpec(List<MethodSpec> methods, String adapterClassName, ClassName superClass) { protected TypeSpec createTypeSpec(List<MethodSpec> methods, String adapterClassName, ClassName superClass) {
@ -97,9 +97,9 @@ public abstract class AbstractAdapterMapperGenerator {
return source; return source;
} }
private List<MethodSpec> buildProxyMethod(AbstractAdapterMethodMetadata adapterMethod, boolean cycle) { private List<MethodSpec> buildProxyMethod(AbstractAdapterMethodMetadata adapterMethod, boolean cycleAvoiding) {
List<MethodSpec> methodSpecs = new ArrayList<>(); List<MethodSpec> methodSpecs = new ArrayList<>();
if (cycle) { if (cycleAvoiding) {
methodSpecs.addAll(buildCycleAvoidingProxyMethod(adapterMethod)); methodSpecs.addAll(buildCycleAvoidingProxyMethod(adapterMethod));
} else { } else {
methodSpecs.addAll(buildDefaultProxyMethod(adapterMethod, null)); methodSpecs.addAll(buildDefaultProxyMethod(adapterMethod, null));

View File

@ -540,12 +540,12 @@ public class AutoMapperProcessor extends AbstractProcessor {
AutoMapperMetadata reverseMapperMetadata = AutoMapperMetadata reverseMapperMetadata =
initAutoMapperMetadata(autoMapperMetadata.getTargetClassName(), initAutoMapperMetadata(autoMapperMetadata.getTargetClassName(),
autoMapperMetadata.getSourceClassName(), autoMapperMetadata.getSourceClassName(),
autoMapperMetadata.isCycles()); autoMapperMetadata.isCycleAvoiding());
reverseMapperMetadata.setConvertGenerate(autoMapperMetadata.isReverseConvertGenerate()); reverseMapperMetadata.setConvertGenerate(autoMapperMetadata.isReverseConvertGenerate());
reverseMapperMetadata.setUsesClassNameList(autoMapperMetadata.getUsesClassNameList()); reverseMapperMetadata.setUsesClassNameList(autoMapperMetadata.getUsesClassNameList());
reverseMapperMetadata.setImportsClassNameList(autoMapperMetadata.getImportsClassNameList()); reverseMapperMetadata.setImportsClassNameList(autoMapperMetadata.getImportsClassNameList());
reverseMapperMetadata.setCycles(autoMapperMetadata.isCycles()); reverseMapperMetadata.setCycleAvoiding(autoMapperMetadata.isCycleAvoiding());
if (reverseMapperMetadata.isCycles()) { if (reverseMapperMetadata.isCycleAvoiding()) {
reverseMapperMetadata.setSuperClass(ClassName.get(ContextConstants.BaseCycleAvoidingMapper.packageName, reverseMapperMetadata.setSuperClass(ClassName.get(ContextConstants.BaseCycleAvoidingMapper.packageName,
ContextConstants.BaseCycleAvoidingMapper.className)); ContextConstants.BaseCycleAvoidingMapper.className));
} else { } else {
@ -588,7 +588,7 @@ public class AutoMapperProcessor extends AbstractProcessor {
} }
AdapterMethodMetadata adapterMethodMetadata = AdapterMethodMetadata adapterMethodMetadata =
AdapterMethodMetadata.newInstance(metadata.getSourceClassName(), metadata.getTargetClassName(), AdapterMethodMetadata.newInstance(metadata.getSourceClassName(), metadata.getTargetClassName(),
metadata.mapperClass(), metadata.isCycles()); metadata.mapperClass(), metadata.isCycleAvoiding());
methodMap.putIfAbsent(adapterMethodMetadata.getMethodName(), adapterMethodMetadata); methodMap.putIfAbsent(adapterMethodMetadata.getMethodName(), adapterMethodMetadata);
} }
@ -598,14 +598,14 @@ public class AutoMapperProcessor extends AbstractProcessor {
mapMethodMap.putIfAbsent(adapterMapMethodMetadata.getMethodName(), adapterMapMethodMetadata); 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(); AutoMapperMetadata metadata = new AutoMapperMetadata();
metadata.setSourceClassName(source); metadata.setSourceClassName(source);
metadata.setTargetClassName(target); metadata.setTargetClassName(target);
metadata.setSuperGenerics(new ClassName[] {source, target}); metadata.setSuperGenerics(new ClassName[] {source, target});
ClassName mapStructConfigClass; ClassName mapStructConfigClass;
if (cycles) { if (cycleAvoiding) {
mapStructConfigClass = ClassName.get(AutoMapperProperties.getConfigPackage(), mapStructConfigClass = ClassName.get(AutoMapperProperties.getConfigPackage(),
AutoMapperProperties.getCycleAvoidingConfigClassName()); AutoMapperProperties.getCycleAvoidingConfigClassName());
} else { } else {
@ -680,7 +680,7 @@ public class AutoMapperProcessor extends AbstractProcessor {
List<AutoMappingMetadata> reverseMappingMetadataList = buildFieldReverseMappingMetadata((TypeElement) ele); List<AutoMappingMetadata> reverseMappingMetadataList = buildFieldReverseMappingMetadata((TypeElement) ele);
reverseMappingMetadataList.removeIf(mappingMetadata -> !isTargetFieldMapping(target, mappingMetadata)); reverseMappingMetadataList.removeIf(mappingMetadata -> !isTargetFieldMapping(target, mappingMetadata));
AutoMapperMetadata metadata = initAutoMapperMetadata(source, target, autoMapper.cycles()); AutoMapperMetadata metadata = initAutoMapperMetadata(source, target, autoMapper.cycleAvoiding());
metadata.setUsesClassNameList(uses); metadata.setUsesClassNameList(uses);
metadata.setImportsClassNameList(importsClassNameList); metadata.setImportsClassNameList(importsClassNameList);
@ -688,8 +688,8 @@ public class AutoMapperProcessor extends AbstractProcessor {
metadata.setFieldReverseMappingList(reverseMappingMetadataList); metadata.setFieldReverseMappingList(reverseMappingMetadataList);
metadata.setConvertGenerate(autoMapper.convertGenerate()); metadata.setConvertGenerate(autoMapper.convertGenerate());
metadata.setReverseConvertGenerate(autoMapper.reverseConvertGenerate()); metadata.setReverseConvertGenerate(autoMapper.reverseConvertGenerate());
metadata.setCycles(autoMapper.cycles()); metadata.setCycleAvoiding(autoMapper.cycleAvoiding());
if (metadata.isCycles()) { if (metadata.isCycleAvoiding()) {
metadata.setSuperClass(ClassName.get(ContextConstants.BaseCycleAvoidingMapper.packageName, metadata.setSuperClass(ClassName.get(ContextConstants.BaseCycleAvoidingMapper.packageName,
ContextConstants.BaseCycleAvoidingMapper.className)); ContextConstants.BaseCycleAvoidingMapper.className));
} else { } else {

View File

@ -59,7 +59,7 @@ public class AutoMapperGenerator {
.build(); .build();
if (metadata.getFieldMappingList() != null && !metadata.getFieldMappingList().isEmpty()) { if (metadata.getFieldMappingList() != null && !metadata.getFieldMappingList().isEmpty()) {
builder.addMethod(addConvertMethodSpec( builder.addMethod(addConvertMethodSpec(
metadata.isCycles() ? CollectionUtils.newArrayList(source, context) : Collections.singletonList(source), metadata.isCycleAvoiding() ? CollectionUtils.newArrayList(source, context) : Collections.singletonList(source),
metadata.getFieldMappingList(), metadata.getFieldMappingList(),
targetClassName, targetClassName,
CONVERT_METHOD_NAME)); CONVERT_METHOD_NAME));
@ -69,13 +69,13 @@ public class AutoMapperGenerator {
if (targetIsImmutable) { if (targetIsImmutable) {
builder.addMethod( builder.addMethod(
addEmptyConvertMethodForImmutableEntity( addEmptyConvertMethodForImmutableEntity(
metadata.isCycles() ? CollectionUtils.newArrayList(source, target, metadata.isCycleAvoiding() ? CollectionUtils.newArrayList(source, target,
context) : CollectionUtils.newArrayList(source, target), context) : CollectionUtils.newArrayList(source, target),
targetClassName, targetClassName,
CONVERT_METHOD_NAME)); CONVERT_METHOD_NAME));
} else if (metadata.getFieldMappingList() != null && !metadata.getFieldMappingList().isEmpty()) { } else if (metadata.getFieldMappingList() != null && !metadata.getFieldMappingList().isEmpty()) {
builder.addMethod(addConvertMethodSpec( builder.addMethod(addConvertMethodSpec(
metadata.isCycles() ? CollectionUtils.newArrayList(source, target, metadata.isCycleAvoiding() ? CollectionUtils.newArrayList(source, target,
context) : CollectionUtils.newArrayList(source, target), context) : CollectionUtils.newArrayList(source, target),
metadata.getFieldMappingList(), metadata.getFieldMappingList(),
targetClassName, targetClassName,

View File

@ -1,9 +1,7 @@
package io.github.linpeilie.processor.metadata; package io.github.linpeilie.processor.metadata;
import com.squareup.javapoet.ClassName; import com.squareup.javapoet.ClassName;
import io.github.linpeilie.processor.AutoMapperProperties;
import java.util.List; import java.util.List;
import org.mapstruct.ReportingPolicy;
public class AutoMapperMetadata extends AbstractMapperMetadata { public class AutoMapperMetadata extends AbstractMapperMetadata {
@ -27,7 +25,7 @@ public class AutoMapperMetadata extends AbstractMapperMetadata {
private boolean reverseConvertGenerate; private boolean reverseConvertGenerate;
private boolean cycles; private boolean cycleAvoiding;
public String mapperName() { public String mapperName() {
return sourceClassName.simpleName() + "To" + targetClassName.simpleName() + "Mapper"; return sourceClassName.simpleName() + "To" + targetClassName.simpleName() + "Mapper";
@ -116,11 +114,11 @@ public class AutoMapperMetadata extends AbstractMapperMetadata {
this.convertGenerate = convertGenerate; this.convertGenerate = convertGenerate;
} }
public boolean isCycles() { public boolean isCycleAvoiding() {
return cycles; return cycleAvoiding;
} }
public void setCycles(boolean cycles) { public void setCycleAvoiding(boolean cycleAvoiding) {
this.cycles = cycles; this.cycleAvoiding = cycleAvoiding;
} }
} }

View File

@ -33,10 +33,13 @@ public @interface AutoMapper {
boolean reverseConvertGenerate() default true; boolean reverseConvertGenerate() default true;
/** /**
* 是否有循环依赖对象 * 是否需要避免对象循环嵌套
* <p>
* 循环嵌套A中有属性类型BB中有属性类型A且可能对象之间互相引用
* </p>
* *
* @return true: 有循环依赖对象 false: 没有循环依赖对象 * @return true: 需要避免对象循环嵌套false不需要
*/ */
boolean cycles() default false; boolean cycleAvoiding() default false;
} }