首页 > 解决方案 > Mapstruct 没有为 Immutables 生成的可选属性选择重载方法

问题描述

我正在使用Immutables生成一些类 DTO 类,并使用 Mapstruct 将 JPA 实体映射到 DTO。只要 DTO 仅具有必需的属性,这将非常有效。如果不需要属性(通过使访问器方法返回一个Optional,根据docs),由 Immutables 生成的构建器将有一个带有Optional参数的 setter 方法,Mapstruct 将失败:

 error: Can't map property "java.lang.Integer id" to "java.util.Optional<java.lang.Integer> id". Consider to declare/implement a mapping method: "java.util.Optional<java.lang.Integer> map(java.lang.Integer value)".

有道理,谢天谢地,还有一个选项可用于生成采用可为空参数的方法。此选项生成一个附加方法,该方法采用可为空的参数。但是,无论此方法是否存在, Mapstruct 似乎都失败了。

作为一种解决方法,我实现了这个可憎的(但此时我宁愿自己实现映射方法):

@Mapper
public class OptionalMapper {

    public <T> T unwrapOptional(final Optional<T> optional) {
        return optional.orElse(null);
    }

    public <T> Optional<T> wrapIntoOptional(final T value) {
        return Optional.ofNullable(value);
    }

有没有办法让 Mapstruct 寻找重载的方法(或先查看“正确”的方法)?我是以错误的方式解决这个问题还是只是错过了一些东西?谢谢!

标签: javamapstructimmutables-library

解决方案


当前编写该自定义OptionalMapper是执行可选项展开的方式。

我不认为这样做是一件坏事。有一个未解决的问题需要支持Optional


推荐阅读