MapStruct: отображение списка не использует одиночное отображение, когда аннотируется @Named - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть следующий 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.

1 Ответ

0 голосов
/ 04 сентября 2018

Необходимо указать метод сопоставления при использовании @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);
}
...