我什么时候应该使用带有 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 注释中的 属性 名称不存在,编译器将抛出错误。