【问题标题】:Extend class from another extended Parametrized Generic class从另一个扩展的参数化通用类扩展类
【发布时间】:2013-07-18 16:22:41
【问题描述】:

我有一个用于通用服务、dao 层的 genericService 支持类(genericService、GenericServiceImpl、GenericDao、GenericHibernateDao)。

通常它工作正常,当我从抽象通用服务扩展任何类型的参数化服务时。当我在不同的服务中扩展此扩展服务时,它会提供:

原因:java.lang.ClassCastException:java.lang.Class 无法转换为 java.lang.reflect.ParameterizedType

错误。

我的 GEnericHibernateDao:

@Transactional 公共抽象类 GenericHibernateDaoSupport 扩展 HibernateDaoSupport 实现 GenericDaoTemplate { 私有类类型;

public GenericHibernateDaoSupport() {
    this.type =  (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}

@Autowired
@Qualifier(value = "productSessionFactory")
 public void bindSessionFactory(SessionFactory sessionFactory)
{
    setSessionFactory(sessionFactory);
}

public Class<T> getType() {
    return type;
}

public void setType(Class<T> type) {
    this.type = type;
}

protected Session getCurrentSession() {
    return getHibernateTemplate().getSessionFactory().getCurrentSession();
}

public ID persist(T newInstance) {
    return (ID) getHibernateTemplate().save(newInstance);
}

public void update(T transientObject) {
    getHibernateTemplate().update(transientObject);
}

这是我的标准扩展 HibernateDao 类:

@Repository
public class StandadHibernateDao extends standardHibernateDaoSupport<Standard, Long> implements StandardDao {

以上扩展操作工作正常,但是当我尝试这样的事情时:

@Repository
public class ExtendStandardGatewayHibernateDao extends StandadHibernateDao implements ExtendedStandardDao {

它抛出:

原因:java.lang.ClassCastException:java.lang.Class 无法转换为 java.lang.reflect.ParameterizedType。

你有什么想法吗?

【问题讨论】:

标签: spring hibernate


【解决方案1】:

要了解 T 的值,您需要通过继承 GenericHibernateDaoSupport 在类型定义中捕获它:

class MyCarDao extends GenericHibernateDaoSupport<Car> {}

如果你愿意,你也可以使用匿名类来做到这一点:

GenericHibernateDaoSupport<Car> myCarDao = new GenericHibernateDaoSupport<Car>{}();

要解析T的值,可以使用TypeTools

Class<?> carType = TypeResolver.resolveRawArgument(GenericHibernateDaoSupport.class, myCarDao.getClass());
assert carType == Car.class;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    相关资源
    最近更新 更多