将 Java 8 可选与 Mapstruct 一起使用

Ahm*_*ziz 5 java mapstruct

我有这两个类:

public class CustomerEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    private String firstName;
    private String lastName;
    private String address;
    private int age;
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;
}
Run Code Online (Sandbox Code Playgroud)

public class CustomerDto {
    private Long customerId;
    private String firstName;
    private String lastName;
    private Optional<String> address;
    private int age;
}
Run Code Online (Sandbox Code Playgroud)

问题是 Mapstruct 无法识别可选变量“地址”。

任何人都知道如何解决它并让 Mapstruct 映射 Optional 字段?

Gus*_*ini 9

Mapstruct 尚不支持开箱即用。他们的 Github 上有一张要求此功能的公开票:https : //github.com/mapstruct/mapstruct/issues/674

在同一张票的评论中添加了解决此问题的一种方法:https : //github.com/mapstruct/mapstruct/issues/674#issuecomment-378212135

@Mapping(source = "child", target = "kid", qualifiedByName = "unwrap")
Target map(Source source);

@Named("unwrap")
default <T> T unwrap(Optional<T> optional) {
    return optional.orElse(null);
}
Run Code Online (Sandbox Code Playgroud)

正如@dschulten 所指出的,如果您想在设置 option 的同时使用此解决方法nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS,您将需要定义一个方法,该方法带有作为映射源的类中的 typeboolean hasXXX()字段的签名(文档中的解释)。XXXOptional