首页 > 解决方案 > MapStruct:@Named 注释时,列表映射不使用单个映射

问题描述

我有以下映射器

@Mapper
@Named("RoleBaseMapper")
public interface RoleBaseMapper {

    @Mapping(target = "code", source = "name")
    @Named("mapToBase")
    RoleGuiBaseDto mapToBase(Role role);

    @Named("MapListToBase")
    List<RoleGuiBaseDto> mapListToBase(List<Role> roles);
}

我期望的是这mapListToBase将用于mapToBase映射列表中的每个条目。但是当我看到生成的代码时,我有以下内容

@Override
public List<RoleGuiBaseDto> mapListToBase(List<Role> roles) {
    if ( roles == null ) {
        return null;
    }

    List<RoleGuiBaseDto> list = new ArrayList<RoleGuiBaseDto>( roles.size() );
    for ( Role role : roles ) {
        list.add( roleToRoleGuiBaseDto( role ) );
    }

    return list;
}

protected RoleGuiBaseDto roleToRoleGuiBaseDto(Role role) {
    if ( role == null ) {
        return null;
    }

    RoleGuiBaseDto roleGuiBaseDto = new RoleGuiBaseDto();

    roleGuiBaseDto.setId( role.getId() );
    roleGuiBaseDto.setDescription( role.getDescription() );

    return roleGuiBaseDto;
}

创建并使用了一个新的映射器方法,而不是使用mapToBase.

我怎么知道mapListToBase使用mapToBase.

注意:没有@Named.

标签: javamapstruct

解决方案


@Named使用(using )时需要限定映射方法@IterableMapping#qualifiedByName

@Mapper
@Named("RoleBaseMapper")
public interface RoleBaseMapper {

    @Mapping(target = "code", source = "name")
    @Named("mapToBase")
    RoleGuiBaseDto mapToBase(Role role);

    @IterableMapping(qualifiedByName = "mapToBase")
    @Named("MapListToBase")
    List<RoleGuiBaseDto> mapListToBase(List<Role> roles);
}

推荐阅读