2011-12-19 50 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(); 
}