存在以下课程
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类型编写相同的代码行。...
答案 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
创建一个方法。