给定五个对象的集合:
KeyDto{String id}
ValueDto{String name, String value, String description}
Key{String id, String name}
Value{String value, String description}
Target{Key key, Value value}
我想用两个参数创建一个映射器:
Target dtosToTarget(KeyDto keyDto, ValueDto valueDto);
但是,仅为键和值定义辅助方法似乎还不够:
@Mapping(source = "keyDto.id", target = "id")
@Mapping(source = "valueDto.name", target = "name")
Key keyDtoAndValueDtoToKey(KeyDto keyDto, ValueDto valueDto);
Value valueDtoToValue(ValueDto valueDto);
这给实际的dtosToTarget方法带来了错误:
错误:(17,19)java:无法将属性“ java.lang.String value”映射到“ mapping.Value value”。考虑声明/实现一个映射方法:“ mapping.Value map(java.lang.String value)”。
我唯一想到的解决方案-定义自定义Java表达式以调用必要的方法,例如
@Mapping(target = "key", expression = "java(keyDtoAndValueDtoToKey(keyDto, valueDto))")
@Mapping(target = "value", expression = "java(valueDtoToValue(valueDto))")
是否有更清洁的方法?
您看到的错误是因为默认情况下,MapStruct会尝试将valueDto.value
映射到Target.value
,即String
到Value
。
但是,您可以这样配置:
@Mapper
public MyMapper {
@Mapping( target = "key.id", source = "keyDto.id")
@Mapping( target = "key.name", source = "valueDto.name")
@Mapping( target = "value", source = "valueDto")
Target dtosToTarget(KeyDto keyDto, ValueDto valueDto);
Value valueDtoToValue(ValueDto valueDto);
}
尝试:
@Mapping(source = "valueDto.name", target = "name")
void keyDtoAndValueDtoToKey(@MappingTarget KeyDto keyDto, ValueDto valueDto);
这将保持键Dto中的所有字段不变,并根据配置将valueDto中的必填字段映射为已配置。