MapStruct:由@Named注释时,列表映射不使用单个映射

问题描述 投票:0回答:1

我有以下Mapper

@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,情况会很好。

java mapstruct
1个回答
2
投票

使用@Named(使用@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);
}
© www.soinside.com 2019 - 2024. All rights reserved.