首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Guice的GenericDAO,使用泛型和ParameterizedType

使用Guice的GenericDAO,使用泛型和ParameterizedType
EN

Stack Overflow用户
提问于 2011-12-20 07:53:13
回答 3查看 2.2K关注 0票数 1

大多数人应该熟悉为Spring + hibernate创建泛型DAO。参考资料来自这里的http://www.ibm.com/developerworks/java/library/j-genericdao/index.html,但在Single DAO & generic CRUD methods (JPA/Hibernate + Spring)上有一个改进

这种改进是对类型的检测,因为它是超类的一部分,而不是使用构造函数来判断它是哪个类

代码语言:javascript
复制
public GenericDaoJpaImpl() {
    ParameterizedType genericSuperclass = (ParameterizedType) getClass()
         .getGenericSuperclass();
    this.entityClass = (Class<T>) genericSuperclass
         .getActualTypeArguments()[0];
}

但是,使用Guice时,此强制转换将失败。要进行注入,需要将接口和类绑定到一个模块中,如下所示

代码语言:javascript
复制
bind(TestDao.class).to(TestDaoImpl.class);

通过这样做,我们的GenericDAO的构造函数技巧将不起作用,原因如下:

代码语言:javascript
复制
getClass().getGenericSuperclass() = java.lang.Class
getClass().getName() = com.gwtplatform.samples.basic.server.dao.TestDaoImpl$$EnhancerByGuice$$5fe0d6fd

与Spring + Hibernate返回的内容相反

代码语言:javascript
复制
getClass().getGenericSuperclass() = sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
getClass().getName() =  com.gwtplatform.samples.basic.server.dao.TestDaoImpl

我现在只是在我的扩展DAO中使用一个超级构造函数,但仍然希望获得类型而不是提供它,你有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-20 12:13:41

“有趣”的方式是让Guice在你的代码中注入一个TypeLiteral。

代码语言:javascript
复制
bind(new TypeLiteral<Dao<Foo>>(){}).to(GenericDAO.class);

然后是…。

代码语言:javascript
复制
class GenericDao implements Dao<T>
  @Inject
  GenericDao(TypeLiteral<T> type) {
    this.whatever = type;
  }
}

Guice知道T的类型,并且很乐意告诉你。TypeLiteral具有获取原始底层类型的访问器。

guice文档中关于这项技术的信息非常少,但这篇博客文章很有帮助:http://blog.publicobject.com/2008/11/guice-punches-erasure-in-face.html

票数 5
EN

Stack Overflow用户

发布于 2011-12-20 08:04:47

这些泛型技巧让我头疼,如果我在那里,我经常会问我是否应该这样做,也许有更好的解决方案,但我认为你可以通过使用Guice中的提供者来做到这一点,所以你是在传递实际的类,而不是让Guice创建它。所以

代码语言:javascript
复制
public class DAOProvider implements Provider<TestDaoImpl> {/*etc*/}

bind(TestDao.class).toProvider(new DAOProvider());
票数 1
EN

Stack Overflow用户

发布于 2013-09-06 02:47:25

您可以使用以下代码从Guice代理获取底层类:

代码语言:javascript
复制
Class<?> clazz = getClass();

if (clazz.getName().contains("EnhancerByGuice")) {
  clazz = clazz.getSuperclass();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8569152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档