首页 > 解决方案 > 当对象 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> rolesprivate 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 做到这一点?

标签: javaspring-bootmapstruct

解决方案


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

推荐阅读