尝试将动态spring代理类型转换为接口时发生ClassCast异常

时间:2019-02-02 17:32:12

标签: java spring cglib

我有一个BaseDao接口和其他扩展BaseDao的特定于实体的Dao接口。

public interface BaseDao<T extends RandomClass> {
 // some methods
}


public interface FooDao extends BaseDao<RandomClassImpl1>  {
// some methods
}

@Lazy
@Component(“fooDao”)
public class FooDaoImpl implements FooDao {

}

public interface BarDaoextends BaseDao<RandomClassImpl2>  {
// some methods
}

@Lazy
@Component(“barDao”)
public class BarDaoImpl implements BarDao {

}

我还创建了一个配置,在其中创建了一个bean,该bean返回一个Map,其中dao组件名称是键,而dao组件是值。

@Lazy
@Configuration
@Import({BarDaoImpl.class, FooDaoImpl.class })
public class DaoRepositoryConfig {

    @Bean(DAO_REPOSITORY)
    Map<String, BaseDao> DaoRepository(
            @Lazy @Qualifier(“fooDao”)
             BaseDao<RandomClassImpl1> foo,
            @Lazy @Qualifier(“barDao”)
             BaseDao<RandomClassImpl2> bar
    ) {
        Map<String, BaseDao> daoRepository = new HashMap<>();
        daoRepository.put(“fooDao”, foo);
        daoRepository.put(“barDao”, bar);
        return daoRepository;
    }

}

当我加载这个bean时,我会得到一个Dao名称的映射以及在配置中导入的相应实现的动态代理。

但是当我尝试将代理类型转换为直接父接口时,它将失败,并显示ClassCastException。

(FooDao)daoRepo.get(“ fooDao”)[在这里daoRepo.get(“ fooDao”),返回在调试器中可以看到的FooDaoImpl的代理,但是当我尝试将其强制转换为FooDao时,ClassCast异常是抛出。

0 个答案:

没有答案