存在以下类
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 - 费用映射器
Spring 不知道该选择哪一个。是的,我所知道的是泛型中的类型删除。所以基本上在编译应用程序后就知道有一个
RevMapper<Entity,Dto>
但没有具体说明是哪种类型。我如何告诉 Spring 插入正确的组件,或者你将如何处理这个问题。我不想为每种类型的 Mapper 编写相同的代码行......
最佳答案
我能想到的解决方案并不比创建很多子类那么耗时。
首先使 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
创建一个方法。
关于java - 使用泛型类型进行 Spring 依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51534253/