2013-07-19 173 views
1

对于泛型服务dao层,我有一个genericService支持类(genericService,GenericServiceImpl,GenericDao,GenericHibernateDao)。从另一个扩展参数化泛型类扩展类

Normaly它工作得很好,当我从扩展抽象通用services.When任何类型的参数化的服务,我延长不同的服务这个扩展服务它给:

造成的: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.Paramete rizedType。

你有什么想法吗?

+0

有什么想法吗? – erhan

+1

http://stackoverflow.com/questions/11067512/java-lang-class-cannot-be-cast-to-java-lang-reflect-parameterizedtype此链接可能有助于 –

回答

0

要了解的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;