我正在使用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 寻找重载的方法(或先查看“正确”的方法)?我是以错误的方式解决这个问题还是只是错过了一些东西?谢谢!