2013-07-19 69 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;