Mapstruct,从几个输入参数映射到嵌套对象
Mapstruct, mapping to nested objects from sevral input parameters
给定一组五个对象:
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"。考虑declare/implement一个映射方法:"mapping.Value map(java.lang.String value)".
我能想到的唯一解决方案 - 是定义自定义 java 表达式来调用必要的方法,例如
@Mapping(target = "key", expression = "java(keyDtoAndValueDtoToKey(keyDto, valueDto))")
@Mapping(target = "value", expression = "java(valueDtoToValue(valueDto))")
有没有更简洁的方法?
尝试:
@Mapping(source = "valueDto.name", target = "name")
void keyDtoAndValueDtoToKey(@MappingTarget KeyDto keyDto, ValueDto valueDto);
这将使 Key Dto 中的所有字段保持原样,并按配置映射 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);
}
给定一组五个对象:
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"。考虑declare/implement一个映射方法:"mapping.Value map(java.lang.String value)".
我能想到的唯一解决方案 - 是定义自定义 java 表达式来调用必要的方法,例如
@Mapping(target = "key", expression = "java(keyDtoAndValueDtoToKey(keyDto, valueDto))")
@Mapping(target = "value", expression = "java(valueDtoToValue(valueDto))")
有没有更简洁的方法?
尝试:
@Mapping(source = "valueDto.name", target = "name")
void keyDtoAndValueDtoToKey(@MappingTarget KeyDto keyDto, ValueDto valueDto);
这将使 Key Dto 中的所有字段保持原样,并按配置映射 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);
}