2011-12-19 29 views
1

大多數人應該熟悉爲Spring + hibernate製作泛型DAO。該參考文獻不同於http://www.ibm.com/developerworks/java/library/j-genericdao/index.html,但有一個改進,它Single DAO & generic CRUD methods (JPA/Hibernate + Spring)GenericDAO與Guice,玩泛型和參數化類型

這種改善是該類型的檢測,因爲它是不是使用構造函數來告訴它是哪一類的父類的一部分,

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

然而,這個演員陣容將失敗,Guice。被注入,接口和類需要在模塊中綁定這樣

bind(TestDao.class).to(TestDaoImpl.class); 

並通過這樣做的構造招我們GenericDAO不會因爲以下的工作:

getClass().getGenericSuperclass() = java.lang.Class 
getClass().getName() = com.gwtplatform.samples.basic.server.dao.TestDaoImpl$$EnhancerByGuice$$5fe0d6fd 

相反的是一個Spring + Hibernate的返回

getClass().getGenericSuperclass() = sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl 
getClass().getName() = com.gwtplatform.samples.basic.server.dao.TestDaoImpl 

我只是用我的擴展的DAO超級構造函數了,但還是想獲得的類型,而不是提供它,任何想法?

回答

5

「guicy」的方法是讓Guice在你的代碼中注入一個TypeLiteral。

bind(new TypeLiteral<Dao<Foo>>(){}).to(GenericDAO.class); 

然後......。

class GenericDao implements Dao<T> 
    @Inject 
    GenericDao(TypeLiteral<T> type) { 
    this.whatever = type; 
    } 
} 

Guice知道T的類型,很高興地告訴你。 TypeLiteral具有訪問器來獲取原始基礎類型。

的吉斯文檔對這一技術珍貴的小信息,但這個博客帖子是有幫助的:http://blog.publicobject.com/2008/11/guice-punches-erasure-in-face.html

+0

我這個標記作爲答案,因爲這是獲得類型的一種方式,但對我來說,最後這只是很多代碼,相比之下,提供類型我自己 – javaNoober 2012-01-11 04:22:13

1

這些通用技巧會讓我的頭部受傷,如果我在那裏,我經常質疑我是否應該成爲,或許有更好的解決方案,但我認爲您可以通過在Guice中使用提供者來做到這一點,正在通過實際的課程,而不是讓Guice創建它。所以

public class DAOProvider implements Provider<TestDaoImpl> {/*etc*/} 

bind(TestDao.class).toProvider(new DAOProvider()); 
0

你可以從吉斯代理基礎類與此代碼:

Class<?> clazz = getClass(); 

if (clazz.getName().contains("EnhancerByGuice")) { 
    clazz = clazz.getSuperclass(); 
}