【问题标题】:How to apply List in one field with MapStruct?如何使用 MapStruct 在一个字段中应用 List?
【发布时间】:2019-10-06 14:51:19
【问题描述】:

我有这个 POJO:

public class PlayerDto {

    private Long id;
    private String name;
    private String past;

}

我有这个实体:

public class Player {

    private Long id;
    private String name;
    private List<String> past;

}

如何使用 MapStruct 将 List&lt;String&gt; past 映射到 DTO 的 String past 中?例如,列表包含 [ Monty , Boto , Flaouri ],而 DTO 的字符串必须在单个字符串中包含“Monty, Boto, Flaouri”。

这种经典方式不适用于目标和源:

@Mappings({
            @Mapping(target = "past", source = "past"),
})
PlayerDto entityToDto(final Player entity);

谢谢

【问题讨论】:

    标签: java mapping mapstruct


    【解决方案1】:

    我猜你需要在映射器接口中定义一个默认方法来处理从List&lt;String&gt;String 的数据转换。 Mapstruct 会自动使用默认方法。

    映射的默认方法签名应该是这样的:

    String map(List<String> past)
    

    例子:

    default String map(List<String> past) {
        return past.stream().collect(Collectors.joining(","));
    }
    

    【讨论】:

    • 感谢您的回答,但我在哪里可以使用它?在@Mapping?
    • MapStruct 将自动检测默认方法并使用它。您不必声明它,只需将方法放在您的映射器接口中即可。在您生成的文件中,您应该会看到类似 playerDto.setPlayer( map( player.getPlayer() ) ); 的内容
    • 我现在只是在测试。我有这个错误,为什么:Can't map property "java.lang.String past" to "java.util.List&lt;xxxxxxxxxxxx.String&gt; past"
    • 哦,看来错误是不同的。您正在尝试将String 映射到List。如果是这种情况,您需要在映射器中定义default method List&lt;String&gt; map(String past)
    • and.. 如果源和目标属性相同(“过去”),则不必指定 @Mapping(target = "past", source = "past")
    猜你喜欢
    • 2022-08-19
    • 1970-01-01
    • 2018-05-07
    • 2019-03-14
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    相关资源
    最近更新 更多