You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用MapStruct将子对象集合映射为字符串集合?

问题描述

现有以下Java类定义:

User 实体类

@Getter
@Setter
public class User {
    Long id;
    String username;
    Set<Role> roles = new HashSet<>();
}

Role 实体类

@Getter
@Setter
public class Role {
    Long id;
    String name;
}

需要使用最新版本的MapStruct,将User对象映射为UserDto类:

public class UserDto {
    Long id;
    String username;
    Set<String> roles = new HashSet<>();
}

目前已实现基础的映射器,但无法完成User中Set<Role>到UserDto中Set<String>的转换(需提取Role的name属性),现有映射器代码如下:

@Mapper
public interface UserMapper {
    UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
    UserDto map(User user);
    // List<String> map(List<Role> roles);
}
解决方案

方法一:定义单个对象的转换方法

在映射器接口中添加一个将Role转换为String的方法,MapStruct会自动将该逻辑应用到集合转换上:

@Mapper
public interface UserMapper {
    UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);

    UserDto map(User user);

    // 单个Role转String,提取name属性
    default String mapRoleToString(Role role) {
        return role != null ? role.getName() : null;
    }
}

无需额外编写集合层面的转换方法,MapStruct会自动处理Set<Role>到Set<String>的转换。

方法二:使用@Mapping结合Java表达式

如果不想单独编写转换方法,可以直接在map方法上通过@Mapping注解指定字段的转换逻辑:

@Mapper
public interface UserMapper {
    UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);

    @Mapping(target = "roles", expression = "java(user.getRoles().stream().map(Role::getName).collect(java.util.stream.Collectors.toSet()))")
    UserDto map(User user);
}

这种方式适合简单的转换场景,直接在注解中编写Java流式处理逻辑。

方法三:命名转换方法(适用于多转换逻辑场景)

如果存在多种Role的转换逻辑,可以用@Named标记特定的转换方法,再在@Mapping中指定使用该方法:

@Mapper
public interface UserMapper {
    UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);

    @Mapping(target = "roles", qualifiedByName = "roleToName")
    UserDto map(User user);

    @Named("roleToName")
    default String roleToName(Role role) {
        return role != null ? role.getName() : null;
    }
}

内容的提问来源于stack exchange,提问作者damien

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 10:02:51