当对象 A 包含对对象 B 的引用时,是否可以使用 Mapstruct 将对象 B 的属性映射到对象 A_DTO 的属性?
Is it possible to map with Mapstruct an attribute of object B to attribute of object A_DTO, when object A contains a reference to object B?
根据 Mapstruct 文档,可以通过为引用对象(对象 B)定义映射方法,将包含另一个对象(对象 B)的对象(对象 A)映射到 DTO。但是,如果我只需要映射该对象(对象 B)的属性而不是整个对象怎么办?
描述问题 -
我正在研究 Spring 启动,这是我的项目 - https://github.com/Alex1182-St/java-spring-jpa-postgresql
为了安全起见,我需要将我的 AppUserEntity 映射到 AppUserDetailsDTO(实现 UserDetails),尤其是我需要映射 name 从我的 AppUserEntity 的属性 private Set<RoleEntity> roles
到我的 AppUserDetailsDTO 的 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
}
}
根据 Mapstruct 文档,可以通过为引用对象(对象 B)定义映射方法,将包含另一个对象(对象 B)的对象(对象 A)映射到 DTO。但是,如果我只需要映射该对象(对象 B)的属性而不是整个对象怎么办?
描述问题 - 我正在研究 Spring 启动,这是我的项目 - https://github.com/Alex1182-St/java-spring-jpa-postgresql
为了安全起见,我需要将我的 AppUserEntity 映射到 AppUserDetailsDTO(实现 UserDetails),尤其是我需要映射 name 从我的 AppUserEntity 的属性 private Set<RoleEntity> roles
到我的 AppUserDetailsDTO 的 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
}
}