- 解决编译警告问题
- 增加unmappedSourcePolicy、unmappedTargetPolicy配置,并且设置unmappedTargetPolicy默认为ignore
- 增加Builder配置,并设置disableBuilder默认为true
This commit is contained in:
linpeilie 2023-03-23 14:37:08 +08:00
parent 4b2587426f
commit 4190985284
6 changed files with 95 additions and 4 deletions

View File

@ -18,7 +18,7 @@
<properties> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<mapstruct.version>1.5.1.Final</mapstruct.version> <mapstruct.version>1.5.1.Final</mapstruct.version>
<mapstruct-plus.version>1.1.8</mapstruct-plus.version> <mapstruct-plus.version>1.1.9</mapstruct-plus.version>
<lombok.version>1.18.22</lombok.version> <lombok.version>1.18.22</lombok.version>
</properties> </properties>

View File

@ -38,6 +38,8 @@ import java.util.stream.Collectors;
import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.RoundEnvironment; import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes; 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.Element;
import javax.lang.model.element.ElementKind; import javax.lang.model.element.ElementKind;
import javax.lang.model.element.TypeElement; 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, @SupportedAnnotationTypes({AUTO_MAPPER_ANNOTATION, AUTO_MAPPERS_ANNOTATION, AUTO_MAP_MAPPER_ANNOTATION,
MAPPER_CONFIG_ANNOTATION, COMPONENT_MODEL_CONFIG_ANNOTATION}) MAPPER_CONFIG_ANNOTATION, COMPONENT_MODEL_CONFIG_ANNOTATION})
@SupportedSourceVersion(SourceVersion.RELEASE_17)
public class AutoMapperProcessor extends AbstractProcessor { public class AutoMapperProcessor extends AbstractProcessor {
private static final ClassName MAPPING_DEFAULT_TARGET = ClassName.get("io.github.linpeilie", "DefaultMapping"); 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(); element) : mapperConfig.mapperPackage();
processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "mapper package " + mapperPackage); processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "mapper package " + mapperPackage);
AutoMapperProperties.setMapperPackage(mapperPackage); AutoMapperProperties.setMapperPackage(mapperPackage);
AutoMapperProperties.setUnmappedSourcePolicy(mapperConfig.unmappedSourcePolicy());
AutoMapperProperties.setUnmappedTargetPolicy(mapperConfig.unmappedTargetPolicy());
AutoMapperProperties.setBuildMethod(mapperConfig.builder().buildMethod());
AutoMapperProperties.setDisableBuilder(mapperConfig.builder().disableBuilder());
}); });
annotations.stream() annotations.stream()
.filter(this::isComponentModelConfigAnnotation) .filter(this::isComponentModelConfigAnnotation)

View File

@ -1,5 +1,8 @@
package io.github.linpeilie.processor; package io.github.linpeilie.processor;
import org.mapstruct.Builder;
import org.mapstruct.ReportingPolicy;
import static io.github.linpeilie.processor.Constants.*; import static io.github.linpeilie.processor.Constants.*;
public class AutoMapperProperties { public class AutoMapperProperties {
@ -8,6 +11,14 @@ public class AutoMapperProperties {
private static String componentModel = DEFAULT_COMPONENT_MODEL; 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() { public static String getMapperPackage() {
return mapperPackage; return mapperPackage;
} }
@ -47,4 +58,36 @@ public class AutoMapperProperties {
public static void setComponentModel(final String componentModel) { public static void setComponentModel(final String componentModel) {
AutoMapperProperties.componentModel = 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;
}
} }

View File

@ -40,11 +40,32 @@ public class MapperConfigGenerator {
usesCodeBuilder.add("$T.class", usesCodeBuilder.add("$T.class",
ClassName.get(AutoMapperProperties.getAdapterPackage(), adapterClassName)); ClassName.get(AutoMapperProperties.getAdapterPackage(), adapterClassName));
CodeBlock usesCodeBlock = usesCodeBuilder.add("}").build(); 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", .addMember("componentModel",
CodeBlock.builder().add("$S", AutoMapperProperties.getComponentModel()).build()) 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(); .build();
builder.addMember("builder", builderCodeBlock);
return builder.build();
} }
} }

View File

@ -4,6 +4,8 @@ import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; import java.lang.annotation.Target;
import org.mapstruct.Builder;
import org.mapstruct.ReportingPolicy;
/** /**
* 在一个类或者接口上添加该注释作为自动生成 Mapper 的配置类在一个模块中只能有一个有该注释的类 * 在一个类或者接口上添加该注释作为自动生成 Mapper 的配置类在一个模块中只能有一个有该注释的类
@ -22,4 +24,22 @@ public @interface MapperConfig {
*/ */
String mapperPackage() default ""; 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);
} }

View File

@ -17,7 +17,7 @@
</modules> </modules>
<properties> <properties>
<mapstruct-plus.version>1.1.8</mapstruct-plus.version> <mapstruct-plus.version>1.1.9</mapstruct-plus.version>
<maven.compiler.source>17</maven.compiler.source> <maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target> <maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>