我将Spring环境更新为4.0.0.RELEASE,在阅读了本文(https://spring.io/blog/2013/12/03/spring-framework-4-0-and-java-generics)之后,我尝试使用新的泛型支持来自动创建GenericDAO。
Spring3.2
在Spring3.2环境中,我为每个DAO实例创建了一个单独的bean,并将类作为参数传递给构造函数。这是因为如我所知,不可能在运行时解析泛型类型。
@Bean
public GenericDaoImpl<Permission, Integer> permissionDao() {
return new GenericDaoImpl<Employee, Integer>(Employee.class, sessionFactory);
}Spring 4.0.
使用Spring4.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();
}因此,我尝试使用GenericTypeResolver和ResolvableType的静态方法来解析类型。但我无法解决这类问题。这还不可能吗?
提前谢谢。
更新:
private Class<T> getGenericType() {
return (Class<T>) GenericTypeResolver.resolveTypeArgument(GenericDaoImpl.class, GenericDao.class);
}发布于 2014-01-29 14:02:58
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);
}差不多吧。
https://stackoverflow.com/questions/21432483
复制相似问题