MapStruct:由@Named

时间:2018-09-04 08:57:15

标签: java mapstruct

我有以下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 :(得分: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);
}