java - 当对象 A 包含对对象 B 的引用时,是否可以使用 Mapstruct 将对象 B 的属性映射到对象 A_DTO 的属性?
问题描述
根据 Mapstruct 文档,可以通过为引用的对象(对象 B)定义映射方法将包含另一个对象(对象 B)的对象(对象 A)映射到 DTO。但是,如果我只需要映射该对象(对象 B)的属性而不是整个对象,该怎么办?
描述问题 - 我正在研究 Spring Boot,这是我的项目 - https://github.com/Alex1182-St/java-spring-jpa-postgresql
为了安全起见,我需要将我的AppUserEntity映射到AppUserDetailsDTO(实现 UserDetails),特别是我需要将我的AppUserEntity属性的名称映射到我的AppUserDetailsDTOprivate Set<RoleEntity> roles
private Collection<GrantedAuthority> authorities
使用 Kotlin 很容易(authorities = roles.map { it.name }):
fun AppUserEntity.toAppUserDetailsDTO() = AppUserDetailsDTO(
id = id,
username = appUserLogin,
password = appUserPassword,
authorities = roles.map { it.name },
isEnabled = isEnabled,
isAccountNonLocked = isAccountNonLocked,
isAccountNonExpired = isAccountNonExpired,
isCredentialsNonExpired = isCredentialsNonExpired
)
但是如何用 Java 和 Mapstruct 做到这一点?
解决方案
在 Mapstruct 上,可以使用注解上的表达式属性将方法用于注解上的映射:expression = "java( yourJavaCodeHere )"
。
你的映射器看起来像:
@Mapper(componentModel = "spring")
public abstract class AppUserDetailsDtoMapper {
@Mappings({
@Mapping(target = "username", source = "appUserLogin"),
@Mapping(target = "password", source = "appUserPassword"),
@Mapping(target = "authorities", expression = "java( mapAuthorities(user.getRoles()) )")
})
public abstract AppUserDetailsDTO toAppUserDetailsDTO(AppUserEntity user);
protected Collection<GrantedAuthority> mapAuthorities(Set<RoleEntity> roles) {
// Map the authorities here
}
}
推荐阅读
- big-o - 从伪代码中判断它是哪个 Big-O 的规则是什么?
- android - 非初始化进程/文件的 SElinux 域转换(Android Natvie)
- c# - 为什么 PictureBox.Invalidate() 会导致程序崩溃?System.AccessViolationException
- javascript - 单击以在两个列表之间交换元素
- php - 从 php 表中从选中的复选框中检索数据
- mysql - 进房限制DB
- c++ - mysql C 连接器函数在类中定义时不起作用
- java - 在二维数组中找到最小值
- python - 我可以将 one-hot 编码向量而不是原始句子直接输入 PYTHON 模块 word2vec.Word2Vec 吗?
- javascript - Jquery通过选择选项数据值设置标记位置