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

我长期坚持这个问题。 我曾经搜索过这个问题,但没有一个解决方案有效。

结构体:

public interface GenericDAO @Repository public class AbstractGenericDAO implements GenericDAO { private Class persistentClass; @Autowired private SessionFactory sessionFactory; static Logger LOGGER = Logger.getLogger(AbstractGenericDAO.class); @SuppressWarnings("unchecked") public AbstractGenericDAO() { this.persistentClass = (Class) ((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 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 @Repository public class ShlkActiveWorkflowDAOImpl extends AbstractGenericDAO implements ShlkActiveWorkflowDAO 

我还在我的application-config.xml中的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.(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.(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 

AbstractGenericDAO删除@Repository注释并使其成为abstract

 public abstract class AbstractGenericDAO implements GenericDAO 

出现问题的原因是@Repository@Component ,这意味着Spring将尝试创建AbstractGenericDAO实例以进行注入。 由于AbstractGenericDAO超类( Object )不是通用的,因此您无法将其Type转发为ParameterizedType ,因此这行代码将失败(就像您尝试使用new AbstractGenericDAO()手动实例化它一样):

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

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

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

如果您担心AbstractGenericDAO@Autowired注释,请不要这样做。 当您注入其子类的一个实例时,Spring将正确地连接所有内容。

 Type genericSuperClass = getClass().getGenericSuperclass(); ParameterizedType parametrizedType = null; while (parametrizedType == null) { if ((genericSuperClass instanceof ParameterizedType)) { parametrizedType = (ParameterizedType) genericSuperClass; } else { genericSuperClass = ((Class) genericSuperClass).getGenericSuperclass(); } } this.itemClass = (Class) parametrizedType.getActualTypeArguments()[0];