泛型类型的Spring依赖注入

时间:2018-07-26 08:25:11

标签: java spring generics

存在以下课程

class Entity{
}

class Dto{
}

public abstract class BaseMapper<E extends Entity, D extends Dto>{

}

以及一些单独的映射器实现,例如:

FooMapper extends BaseMapper<Foo, FooDto>{

}

FeeMapper extends BaseMapper<Fee, FeeDto>{

}

不,我想集成一些“包装器”,它比常规的数据映射功能更多,因为我有了新的概念/问题

@Component
public final class RevMapper<ENTITY extends Entity, DTO extends Dto> {

    private BaseMapper<ENTITY, DTO> baseMapper;

    @Autowired
    public <MAPPER extends BaseMapper<ENTITY, DTO>> RevMapper(MAPPER mapper) {
        this.baseMapper = mapper;
    }

    public List<RevDto<DTO>> toDto(final List<Rev<ENTITY>> revList) {
        for(Rev<ENTITY> rev: revList){
            ...
            baseMapper.toDto(rev.getEntity(), true);
        }
        ...
    }
}

并将其包含在我的服务中,例如:

@Autowired
private RevMapper<Foo, FooDto> fooRevMapper;

现在的问题是:

com.test.package.RevMapper中的构造函数的参数0需要单个bean,但是找到了2个: -FooMapper -FeeMapper

Spring不知道该拿哪个。是的,我所知道的是关于泛型的类型擦除。因此,基本上,在编译应用程序之后,只知道有一个

RevMapper<Entity,Dto>

,但不是具体的类型。我该如何告诉Spring插入正确的组件,或者您将如何处理此问题。我不想为每种Mapper类型编写相同的代码行。...

1 个答案:

答案 0 :(得分:1)

我能想到的解决方案并不像创建许多子类那样耗时。

首先使RevMapper不是@Component,然后创建如下所示的类:

@Configuration
public final class Mappers{

    private final FooMapper fooMapper;
    private final FeeMapper feeMapper;

    @Autowired
    public Mappers(FooMapper fooMapper, FeeMapper feeMapper){
        this.fooMapper = fooMapper;
        this.feeMapper = feeMapper;
    }

    @Bean
    public RevMapper<Foo, FooDto> fooRevMapper(){
        return new RevMapper(fooMapper);
    }

    @Bean
    public RevMapper<Fee, FeeDto> feeRevMapper(){
        return new RevMapper(feeMapper);
    }
}

这不只是为要提供的每个RevMapper创建一个方法。