使用 Java 8 optional with Mapstruct
Use Java 8 optional with 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;
}
和
public class CustomerDto {
private Long customerId;
private String firstName;
private String lastName;
private Optional<String> address;
private int age;
}
问题是 Mapstruct 无法识别可选变量 "address"。
有人知道如何解决它并让 Mapstruct 映射可选字段吗?
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);
}
正如@dschulten 所指出的,如果您想在设置选项 nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS
的同时使用此解决方法,则需要为字段 [=13] 定义一个带有签名 boolean hasXXX()
的方法=] 类型 Optional
在 class 里面是映射源 (explanation in the docs).
我有这两个类:
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;
}
和
public class CustomerDto {
private Long customerId;
private String firstName;
private String lastName;
private Optional<String> address;
private int age;
}
问题是 Mapstruct 无法识别可选变量 "address"。
有人知道如何解决它并让 Mapstruct 映射可选字段吗?
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);
}
正如@dschulten 所指出的,如果您想在设置选项 nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS
的同时使用此解决方法,则需要为字段 [=13] 定义一个带有签名 boolean hasXXX()
的方法=] 类型 Optional
在 class 里面是映射源 (explanation in the docs).