2014-01-29 216 views
2

的解决型我更新了我的Spring MVC环境版本4.0.0.RELEASE。阅读本文后(https://spring.io/blog/2013/12/03/spring-framework-4-0-and-java-generics),我尝试使用新的泛型支持来自动装载我的GenericDAO。春季4.0:GenericDao

春3.2

在Spring 3.2的环境我为每个DAO实例创建一个单独的bean,并通过班级为paramameter来构造。这是因为我知道,在运行时不可能解析泛型类型。

@Bean 
public GenericDaoImpl<Permission, Integer> permissionDao() { 
    return new GenericDaoImpl<Employee, Integer>(Employee.class, sessionFactory); 
} 

春4.0.0.RELEASE

随着春天4.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(); 
} 

所以,我试图用GenericTypeResolverResolvableType静态方法来解决的类型。但我无法解决这种类型。这仍然不可能吗?

在此先感谢。

UPDATE:

private Class<T> getGenericType() { 
    return (Class<T>) GenericTypeResolver.resolveTypeArgument(GenericDaoImpl.class, GenericDao.class); 
} 
+0

请添加您尝试过的代码,但无法正常工作。 –

+0

请检查更新 – Tunguska

+0

我有完全相同的问题。你有没有找到解决办法? –

回答

1
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); 
} 

之类的东西。

+1

我retrun(类)GenericTypeResolver.resolveTypeArguments(的getClass(),GenericDao.class)尝试了[0]; - >因为Generic Dao有两个类型参数,但总是接收null。 – Tunguska

+0

仍然没有解决方案来解决由spring ioc创建的对象的泛型类型? (不通过构造函数传递类型) – Tunguska