【问题标题】:Spring 4.0: Resolve Type of GenericDaoSpring 4.0:解析 GenericDao 的类型
【发布时间】:2014-01-29 13:26:39
【问题描述】:

我将 Spring MVC 环境更新到版本 4.0.0.RELEASE。在阅读了这篇文章 (https://spring.io/blog/2013/12/03/spring-framework-4-0-and-java-generics) 之后,我尝试使用新的泛型支持来自动装配我的 GenericDAO。

春季 3.2

在 Spring 3.2 环境中,我为每个 DAO 实例创建了一个单独的 bean,并将该类作为参数传递给构造函数。这是因为据我所知,无法在运行时解析泛型类型。

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

春季 4.0.0.RELEASE

在 spring 4.0 中,我只需要在 Service 中自动装配我的 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的静态方法来解析类型。但我无法解析类型。这仍然不可能吗?

提前致谢。

更新:

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

【问题讨论】:

  • 请添加您尝试过但无法正常工作的代码。
  • 我也有同样的问题。你有没有找到解决办法?
  • 很遗憾,我仍在使用旧解决方案。

标签: java spring generics spring-mvc autowired


【解决方案1】:
private Class<T> getGenericType() {
    return (Class<T>) GenericTypeResolver.resolveTypeArgument(GenericDaoImpl.class, GenericDao.class);
}

您的GenericDaoImpl 没有关联类型,因为它是通用的,它不会解析为正确的类型。

您应该调用 getClass() 并将其传入,而不是传入 GenericDaoImpl.class,因为您想知道当前实例的类型

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

类似的东西。

【讨论】:

  • 我尝试使用 retrun (Class) GenericTypeResolver.resolveTypeArguments(getClass(), GenericDao.class)[0]; --> 因为 Generic Dao 有两个类型参数,但总是接收 null。
  • 仍然没有解决由spring ioc创建的对象的泛型类型的解决方案吗? (不通过构造函数传递类型)
猜你喜欢
  • 2014-04-16
  • 1970-01-01
  • 2015-06-10
  • 1970-01-01
  • 2014-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
相关资源
最近更新 更多