我什么时候应该使用带有 java 8 的 mapstruct 或转换器以避免容易出错?
When should I use mapstruct or converters with java 8 to avoid error-prone?
在工作中,我们在许多具有 Java 8 个 REST Full 应用程序的 SpringBoot 项目中使用 MapStruct,当我们需要将实体映射到 DTO 或将 DTO 映射到响应或类似情况时。但是今天我的朋友向我展示了使用简单的 Converter 而不是 MapStruct 的巨大优势。
这是一个使用 MapStrurct 的简单示例:
@Mapper(componentModel="spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface AccountMapper {
@Mapping(source = "customerBank.customerId", target = "customerId")
AccountResponse toResponse(AccountBank accountBank);
}
它工作得很好,但实际上如果有人用另一个名称更改了 customerId 属性而忘记更改此映射器,我们将出现运行时错误。
Converter 的优点是我们会遇到编译时错误并避免运行时错误。
如果有人设法分享如何避免运行时错误,请告诉我,就像我提出的场景一样,使用 MapStruct,因为 Converter 没有带来同样的优势。
我的问题是:是否可以高效地使用 MapStruct,我的意思是在没有运行时错误的情况下?
如果我理解得很好,您希望使用 MapStruct 自定义映射时因 属性 命名错误而出现编译时错误。
如果是这样,您应该在 pom.xml(如果您使用 maven)中添加一个必要的构建插件。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
当然还有为 MapStruct 版本声明 属性:
<properties>
<mapstruct.version>1.4.1.Final</mapstruct.version>
</properties>
编译项目后,添加插件后,注释处理器将生成完整的实现:
public class AccountMapperImpl implements AccountMapper
在 target\generated-sources\annotations 文件夹中。
您可以检查生成的实现源代码 class,所有内容均已设置并仔细检查。
如果 @Mapping
注释中的 属性 名称不存在,编译器将抛出错误。
在工作中,我们在许多具有 Java 8 个 REST Full 应用程序的 SpringBoot 项目中使用 MapStruct,当我们需要将实体映射到 DTO 或将 DTO 映射到响应或类似情况时。但是今天我的朋友向我展示了使用简单的 Converter 而不是 MapStruct 的巨大优势。
这是一个使用 MapStrurct 的简单示例:
@Mapper(componentModel="spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface AccountMapper {
@Mapping(source = "customerBank.customerId", target = "customerId")
AccountResponse toResponse(AccountBank accountBank);
}
它工作得很好,但实际上如果有人用另一个名称更改了 customerId 属性而忘记更改此映射器,我们将出现运行时错误。
Converter 的优点是我们会遇到编译时错误并避免运行时错误。
如果有人设法分享如何避免运行时错误,请告诉我,就像我提出的场景一样,使用 MapStruct,因为 Converter 没有带来同样的优势。
我的问题是:是否可以高效地使用 MapStruct,我的意思是在没有运行时错误的情况下?
如果我理解得很好,您希望使用 MapStruct 自定义映射时因 属性 命名错误而出现编译时错误。 如果是这样,您应该在 pom.xml(如果您使用 maven)中添加一个必要的构建插件。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
当然还有为 MapStruct 版本声明 属性:
<properties>
<mapstruct.version>1.4.1.Final</mapstruct.version>
</properties>
编译项目后,添加插件后,注释处理器将生成完整的实现:
public class AccountMapperImpl implements AccountMapper
在 target\generated-sources\annotations 文件夹中。
您可以检查生成的实现源代码 class,所有内容均已设置并仔细检查。
如果 @Mapping
注释中的 属性 名称不存在,编译器将抛出错误。