首页 > 解决方案 > 尝试将动态弹簧代理类型强制转换为接口时出现 ClassCast 异常

问题描述

我有一个接口 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,它返回一个 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 异常。

标签: javaspringcglib

解决方案


推荐阅读