我一直在试验模型映射器,并且我有一个使用Optional
的DTO,我想使用可为空的字段将其映射到实体。
在一个测试中,我制作了FooOptional
和FooNullable
,它们分别具有字段Optional<BarOptional>
和BarNullable
。想法是映射setBar
方法,以便模型映射器将可选参数转换为null,反之亦然。
我通过写作使它起作用
private static <S, D> Converter<Optional<S>, D> optionalToNullable(final TypeMap<S, D> barMapper) {
return
context ->
barMapper.map(context.getSource().orElse(null));
}
...
TypeMap<BarNullable, BarOptional> barMap = mapper.createTypeMap(BarNullable.class, BarOptional.class);
mapper.createTypeMap(FooNullable.class, FooOptional.class)
.addMappings(
expr ->
expr
.using(nullableToOptional(barMap))
.map(FooNullable::getBar, FooOptional::setBar)
);
类似的事情在相反的方向上起作用。这一切似乎都很笨拙,我想知道我是否缺少什么。
我们的DTO使用代码生成(正确或错误地)使用Optional
对可为空的属性建模。我们通常不对数据库实体使用Optional
,并且在任何情况下它似乎都不起作用。这一切可能是错误的,也可能不是错误的,但是我不能轻易改变它,这也不是问题的重点。