2014-01-29 215 views
2

的解決型我更新了我的Spring MVC環境版本4.0.0.RELEASE。閱讀本文後(https://spring.io/blog/2013/12/03/spring-framework-4-0-and-java-generics),我嘗試使用新的泛型支持來自動裝載我的GenericDAO。春季4.0:GenericDao

春3.2

在Spring 3.2的環境我爲每個DAO實例創建一個單獨的bean,並通過班級爲paramameter來構造。這是因爲我知道,在運行時不可能解析泛型類型。

@Bean 
public GenericDaoImpl<Permission, Integer> permissionDao() { 
    return new GenericDaoImpl<Employee, Integer>(Employee.class, sessionFactory); 
} 

春4.0.0.RELEASE

隨着春天4.0我只需要我的自動裝配在GenericDAO像服務:

@Autowired private GenericDaoImpl<Employee, Integer> employeeDao; 

並在GenericDAOImpl:

@Repository 
public class GenericDaoImpl<T, PK extends Serializable> implements GenericDao<T, Serializable> { 

     @Autowired 
     private SessionFactory sessionFactory; 
     private Class<?> genericType; 

該解決方案非常容易,並且可以在大多數情況下工作我的DAO方法。但是對於其中的一些人,我需要知道我的GenericDAO實例具有哪種類型。

@Override 
public List<T> findAll() { 
    return getCurrentSession().createQuery("FROM " + getGenericType().getName()).list(); 
} 

所以,我試圖用GenericTypeResolverResolvableType靜態方法來解決的類型。但我無法解決這種類型。這仍然不可能嗎?

在此先感謝。

UPDATE:

private Class<T> getGenericType() { 
    return (Class<T>) GenericTypeResolver.resolveTypeArgument(GenericDaoImpl.class, GenericDao.class); 
} 
+0

請添加您嘗試過的代碼,但無法正常工作。 –

+0

請檢查更新 – Tunguska

+0

我有完全相同的問題。你有沒有找到解決辦法? –

回答

1
private Class<T> getGenericType() { 
    return (Class<T>) GenericTypeResolver.resolveTypeArgument(GenericDaoImpl.class, GenericDao.class); 
} 

GenericDaoImpl沒有關聯,因爲它是通用的一類,它不會解決到合適的類型。

不是傳遞在GenericDaoImpl.class你應該調用getClass()並把它傳遞,因爲你想知道當前實例的類型

private Class<T> getGenericType() { 
    return (Class<T>) GenericTypeResolver.resolveTypeArgument(getClass(), GenericDao.class); 
} 

之類的東西。

+1

我retrun(類)GenericTypeResolver.resolveTypeArguments(的getClass(),GenericDao.class)嘗試了[0]; - >因爲Generic Dao有兩個類型參數,但總是接收null。 – Tunguska

+0

仍然沒有解決方案來解決由spring ioc創建的對象的泛型類型? (不通過構造函數傳遞類型) – Tunguska