如何在MapStruct中实现UserRoleRequestDTO到UserRole的映射?
问题描述
现有UserRole实体类用于存储用户角色信息,代码如下:
@Entity @Table(name="user_roles") public class UserRole implements Serializable{ private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column private long userRoleId; @ManyToOne @JoinColumn(name = "user_id", foreignKey = @ForeignKey(name = "users_fk"), nullable=false) private User user; @ManyToOne @JoinColumn(name = "role_id", foreignKey = @ForeignKey(name = "roles_fk"), nullable=false) private Role role; // 省略构造方法、getter/setter等 }
同时有一个UserRoleRequestDTO类,仅包含userName和role字符串属性:
public class UserRoleRequestDTO { private String userName; private String role; // 省略构造方法、getter/setter等 }
需要编写对应的MapStruct映射器,当前映射器接口框架如下,请问@Mapping注解该如何配置?
@Mapper public interface UserRoleMapper { @Mapping(//** 此处应如何配置? **//) UserRole UserRoleRequestDTOtoUserRole(UserRoleRequestDTO userRoleRequestDTO); }
解决方案
要实现从UserRoleRequestDTO到UserRole的映射,需要处理嵌套对象的属性赋值,具体配置如下:
完整映射器代码
@Mapper public interface UserRoleMapper { // 将DTO的userName映射到UserRole.user.userName @Mapping(target = "user.userName", source = "userName") // 将DTO的role映射到UserRole.role.name(假设Role实体中存储角色名称的属性为name) @Mapping(target = "role.name", source = "role") // 自增主键由数据库生成,无需映射 @Mapping(target = "userRoleId", ignore = true) UserRole userRoleRequestDTOtoUserRole(UserRoleRequestDTO userRoleRequestDTO); }
关键说明
- 嵌套属性映射:
UserRole中的user和role是对象类型,需通过.指定嵌套属性路径,比如user.userName表示给UserRole内User对象的userName属性赋值。 - Role实体属性适配:如果你的
Role实体中角色名称的属性不是name(比如是roleName),需将role.name替换为对应路径,例如role.roleName。 - 主键忽略:
userRoleId是自增主键,由数据库自动生成,设置ignore = true避免映射时赋值干扰。
空指针规避补充
如果MapStruct自动创建的User或Role对象出现空指针问题,可以通过expression属性手动实例化对象:
@Mapper public interface UserRoleMapper { @Mapping(target = "user.userName", source = "userName") @Mapping(target = "role.name", source = "role") @Mapping(target = "userRoleId", ignore = true) // 显式实例化User和Role对象 @Mapping(target = "user", expression = "java(new User())") @Mapping(target = "role", expression = "java(new Role())") UserRole userRoleRequestDTOtoUserRole(UserRoleRequestDTO userRoleRequestDTO); }
内容的提问来源于stack exchange,提问作者jkfe
相关产品推荐
相关产品推荐

