当对象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 private Set<RoleEntity> roles属性归我的 AppUserDetailsDTO

private Collection<GrantedAuthority> authorities

使用Kotlin可以很容易(authorities = role.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 )"的expression属性将方法用于注释上的映射。

您的映射器如下所示:

@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
    }
}