大多数人应该熟悉为Spring + hibernate创建泛型DAO。参考资料来自这里的http://www.ibm.com/developerworks/java/library/j-genericdao/index.html,但在Single DAO & generic CRUD methods (JPA/Hibernate + Spring)上有一个改进
这种改进是对类型的检测,因为它是超类的一部分,而不是使用构造函数来判断它是哪个类
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中使用一个超级构造函数,但仍然希望获得类型而不是提供它,你有什么想法吗?
发布于 2011-12-20 12:13:41
“有趣”的方式是让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具有获取原始底层类型的访问器。
guice文档中关于这项技术的信息非常少,但这篇博客文章很有帮助:http://blog.publicobject.com/2008/11/guice-punches-erasure-in-face.html
发布于 2011-12-20 08:04:47
这些泛型技巧让我头疼,如果我在那里,我经常会问我是否应该这样做,也许有更好的解决方案,但我认为你可以通过使用Guice中的提供者来做到这一点,所以你是在传递实际的类,而不是让Guice创建它。所以
public class DAOProvider implements Provider<TestDaoImpl> {/*etc*/}
bind(TestDao.class).toProvider(new DAOProvider());发布于 2013-09-06 02:47:25
您可以使用以下代码从Guice代理获取底层类:
Class<?> clazz = getClass();
if (clazz.getName().contains("EnhancerByGuice")) {
clazz = clazz.getSuperclass();
}https://stackoverflow.com/questions/8569152
复制相似问题