当前位置: 首页 > 面试题库 >

无法将java.lang.Class强制转换为java.lang.reflect.ParameterizedType

屈博
2023-03-14
问题内容

我长期困扰这个问题。我有一段时间搜索此问题,但没有解决方案。

结构体:

public interface GenericDAO<T extends Serializable, ID extends Serializable>

@Repository
public class AbstractGenericDAO<T extends Serializable, ID extends Serializable> 
    implements GenericDAO<T, ID> {

   private Class<T> persistentClass;

   @Autowired
   private SessionFactory sessionFactory;

   static Logger LOGGER = Logger.getLogger(AbstractGenericDAO.class);


   @SuppressWarnings("unchecked")
   public AbstractGenericDAO() {
       this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
   }

   /**
    * @param entity
    * @return T
    * @throws DBException
    */
   @SuppressWarnings("unchecked")
   public T saveEntity(T entity) throws DBException {
       return saveEntity(entity, false);
   }

   /**
    * @param entity
    * @param explicitFlush
    * @return T
    * @throws DBException
    */
   @SuppressWarnings("unchecked")
   public T saveEntity(T entity, boolean explicitFlush) throws DBException {
       Session session = getSessionFactory().getCurrentSession();

       try {
           session.save(entity);
           if(explicitFlush) {
               session.flush();
               session.refresh(entity);
           }
       } catch (HibernateException he) {
           String errorMsg = "Could not save entity. Reason: " + he.getMessage();
           LOGGER.error(errorMsg, he);
           throw new DBException(errorMsg, he);
       }

       return entity;
   }

   /* (non-Javadoc)
    * @see com.amazon.fc.receive.dbaccess.dao.GenericDAO#getPersistentClass()
    */
   @SuppressWarnings("unchecked")
   public Class<T> getPersistentClass() {
       return persistentClass;
   }

   /**
    * @return the sessionFactory
    */
   public SessionFactory getSessionFactory() {
       return this.sessionFactory;
   }

   /**
    * @param sessionFactory the sessionFactory to set
    */
   @Autowired
   public void setSessionFactory(SessionFactory sessionFactory) {
       this.sessionFactory = sessionFactory;
   }
}

public interface ShlkActiveWorkflowDAO 
    extends GenericDAO<ShlkActiveWorkflow, Serializable>

@Repository
html" target="_blank">public class ShlkActiveWorkflowDAOImpl 
    extends AbstractGenericDAO<ShlkActiveWorkflow, Serializable>
    implements ShlkActiveWorkflowDAO

我也用<context:component-scan>application-config.xml + <tx:annotation- driven />在我的application-config.xml

请提供有关如何解决此问题的一些信息。

Exception:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'abstractGenericDAO'

Constructor threw exception; nested exception is java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:946)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:890)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:479)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:557)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:842)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:416)
    at com.coral.spring.Launcher.<init>(Launcher.java:95)
    at com.coral.spring.Launcher.main(Launcher.java:56)
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.workflow.dao.AbstractGenericDAO]: Constructor threw exception; nested exception is     
java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:141)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:72)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:938)
    ... 12 more
Caused by: java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
    at com.workflow.dao.AbstractGenericDAO.<init>(AbstractGenericDAO.java:43)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:126)
    ... 14 more

问题答案:

@Repository从中删除注释AbstractGenericDAO并使其abstract

public abstract class AbstractGenericDAO<T extends Serializable, ID extends Serializable> 
   implements GenericDAO<T, ID>

发生您的问题是因为@Repository的特化@Component,这意味着Spring将尝试创建AbstractGenericDAO注入实例。由于AbstractGenericDAOsuperclass(Object)不是通用的,因此您无法将其向下转换TypeParameterizedType,因此这行代码将失败(与尝试使用手动实例化该代码的方式相同new AbstractGenericDAO()):

this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];

专业课ShlkActiveWorkflowDAOImpl仍应使用注释@Repository。当spring尝试创建此类的实例时,AbstractGenericDAO将对构造函数进行隐式调用,但是这一次上面提到的代码行将按预期运行。发生这种情况是因为getClass()return
ShlkActiveWorkflowDAOImpl.class是泛型的子类AbstractGenericDAO(因此向下转换ParameterizedType有效)。

由于ShlkActiveWorkflowDAOImpl extends
AbstractGenericDAO<ShlkActiveWorkflow, Serializable>实际类型ShlkActiveWorkflow将在运行时正确反映。这是避免将Class<T>引用传递给AbstractGenericDAO构造函数的已知解决方法。

如果您对的@Autowired注释感到担心AbstractGenericDAO,请不必担心。当您注入其子类之一的实例时,Spring会正确地连接一切。



 类似资料:
  • 问题内容: 我使用泛型创建了接口和类的层次结构,并弄乱了所有内容。 最顶级的类是AbstractJpaEntity,它由所有域实体扩展 ProductTypeDomain类类似于标记类,用于分离出几个表实体。 接口“ GenericDao”的定义 抽象类GenericDaoImpl(此类具有通用功能,例如persist,merge) 接口ProductTypeDao Spring存储库类Produ

  • 问题内容: 我是Java Reflection的新手。 我检查了很多论坛,但找不到有效的解决方案。 错误: 当我试图从数据库获取对象时: 方法声明 二级扩展 实体类: 并在控制器中调用方法: 这很奇怪,因为我有其他实体可以在没有任何运行时错误的情况下使用该方法。这是该实体: 并在其他控制器中调用该方法: 此代码有效。我看不到模型和控制器之间的任何区别。 有人可以帮我指出我的错误吗? -------

  • 我在这个问题上坚持了很长时间。我搜索了这个问题一段时间,但没有一个解决方案有效。 结构: 我也在使用

  • 问题内容: 我有MainActivity类,该类具有实例化ApplicationBar的方法,所有其他Activity都从此继承,因此他们可以使用此方法。 但是我也有一个MapHolder类,它必须从xml中扩展,因为它使用来显示地图。问题是如果我从不显示ApplicationBar选项卡扩展它,并且从MainActivity扩展它而不显示地图,则出现此错误: 问题答案: 您正在尝试将a强制转换为

  • 问题内容: 我收到以下异常。 造成原因: java.lang.ClassCastException:无法将java.math.BigInteger强制转换为java.lang.Integer 用下面的代码 在这条线 有人知道吗? 问题答案: 您可以使用: 或者也许覆盖了和价值观。

  • 问题内容: 我有一个将对象作为输入的方法,如果输入是instanceOF Long,则将值转换为double值。下面是代码: 但是当我执行上面的代码时,我得到下面的异常: 请让我知道为什么它给了我例外。 但是,如果直接尝试将Long对象转换为double,则不会发生classCast异常。 这很混乱。 问题答案: 在JLS中找到了解释,请 参见表5.1 下的https://docs.oracle.