【问题标题】:Mapstruct, mapping to nested objects from sevral input parametersMapstruct,从多个输入参数映射到嵌套对象
【发布时间】:2020-02-12 16:09:57
【问题描述】:

给定一组五个对象:

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

然而,仅仅为 Key 和 Value 定义辅助方法似乎是不够的:

@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


    【解决方案1】:

    您看到的错误是因为默认情况下 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);
    }
    

    【讨论】:

      【解决方案2】:

      试试:

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

      这将使 Key Dto 中的所有字段保持原样,并将 valueDto 中的必需字段映射为配置。

      【讨论】:

      • 我不确定我是否理解您的建议。这会将 ValueDto.name 映射到 KeyDto.name。然而 KeyDto 甚至没有名字。正确的目标是 Key.name。但这并不能解决实际问题。或许你可以在github上表达得更好:github.com/piddubnyi/mapstruct-mapping
      猜你喜欢
      • 2016-10-14
      • 2023-03-29
      • 1970-01-01
      • 2012-02-25
      • 2020-11-16
      • 1970-01-01
      • 2018-09-15
      • 2019-07-13
      • 1970-01-01
      相关资源
      最近更新 更多