java - 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 寻找重载的方法(或先查看“正确”的方法)?我是以错误的方式解决这个问题还是只是错过了一些东西?谢谢!
解决方案
当前编写该自定义OptionalMapper
是执行可选项展开的方式。
我不认为这样做是一件坏事。有一个未解决的问题需要支持Optional
推荐阅读
- javascript - running functions synchronously in firebase
- python - 如何使用 raspberry pi 和 python 扫描路由器的 RSSI 并根据值对它们进行排序?
- php - 检查两条路线(以纬度和经度表示)是否彼此相对
- angular - Angular 6 set 属性全局动态生成组件
- sql - How to declare a number variable where I can save th count of table in my loop
- c# - TFS 2018 Microsoft.VisualStudio.Services.WebApi.VssServiceResponseException:找不到页面
- acumatica - Acumatica REST API - StockItem - 如何在请求中使用具有特定产品 ID 的多个产品 ID
- java - 如何测试 Java 类是线程安全的?
- javascript - 交换变量的硬编码参数
- node.js - NodeJS + mongoose - 全局用户动态数据库