【问题标题】:Mapstruct not selecting overloaded method for optional properties generated by ImmutablesMapstruct 没有为 Immutables 生成的可选属性选择重载方法
【发布时间】:2021-06-29 08:07:16
【问题描述】:

我正在使用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)".

有道理,谢天谢地,有一个 option 可用于生成采用可为空参数的方法。此选项生成一个 附加 方法,该方法采用可为空的参数。然而,不管这个方法是否存在,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 寻找重载的方法(或先查看“正确”的方法)?我是以错误的方式解决这个问题还是只是错过了一些东西?谢谢!

【问题讨论】:

    标签: java mapstruct immutables-library


    【解决方案1】:

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

    我不认为这样做是一件坏事。有一个开放的issue 用于支持Optional

    【讨论】:

    • 嗨菲利普,感谢您的回复。我的问题不在于 Mapstruct 不会自行解包 Optionals,而更多的是它不使用采用可为空参数的重载方法(这将否定 Mapstruct 解包 Optionals 的需要) .这是一个错误还是我做错了什么?
    • 我当时误解了这个问题。我想你可能会被mapstruct/mapstruct/2377
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 2019-03-29
    • 2012-07-10
    相关资源
    最近更新 更多