Mapstruct,从多个输入参数映射到嵌套对象

问题描述 投票:0回答:2

给定五个对象的集合:

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))")

是否有更清洁的方法?

java dto mapstruct
2个回答
0
投票

您看到的错误是因为默认情况下,MapStruct会尝试将valueDto.value映射到Target.value,即StringValue

但是,您可以这样配置:

@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);
}

-1
投票

尝试:

@Mapping(source = "valueDto.name", target = "name")
void keyDtoAndValueDtoToKey(@MappingTarget KeyDto keyDto, ValueDto valueDto);

这将保持键Dto中的所有字段不变,并根据配置将valueDto中的必填字段映射为已配置。

© www.soinside.com 2019 - 2024. All rights reserved.