我在这个问题上坚持了很长时间。我搜索了这个问题一段时间,但没有一个解决方案有效。
结构:
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
public class ShlkActiveWorkflowDAOImpl
extends AbstractGenericDAO<ShlkActiveWorkflow, Serializable>
implements ShlkActiveWorkflowDAO
我也在使用
请提供有关如何解决此问题的一些信息。
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
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<T>) parametrizedType.getActualTypeArguments()[0];
从<code>AbstractGenericDAO@Repository
public abstract class AbstractGenericDAO<T extends Serializable, ID extends Serializable>
implements GenericDAO<T, ID>
您的问题之所以会出现,是因为< code>@Repository是< code>@Component的一个专门化,这意味着Spring将尝试创建用于注入的< code>AbstractGenericDAO实例。由于< code>AbstractGenericDAO超类(< code>Object)不是泛型的,因此您将无法将其< code>Type向下转换为< code>ParameterizedType,因此这一行代码将会失败(与您尝试使用< code > new AbstractGenericDAO()手动实例化它的方式相同):
this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
专用类 ShlkActiveWorkflowDAOImpl
仍应使用@Repository
进行注释。当 spring 尝试创建此类的实例时,将发生对 AbstractGenericDAO
构造函数的隐式调用,但这次上面提到的代码行将按预期运行。发生这种情况是因为getClass()
返回ShlkActiveWorkflowDAOImpl.class
它是泛型抽象GenericDAO
的子类(因此向下转换为参数化类型
的工作原理)。
由于ShlkActiveWorkflow DAOImpl
扩展了
AbstractGenericDAO
如果您担心<code>AbstractGenericDAO@Autowired
我得到以下错误,不能理解它的问题: 创建在类路径资源[xx/yy//zz.xml]中定义的名为“someJobBean”的Bean时出错:bean的实例化失败;嵌套异常为org . spring framework . beans . Factory . beandeditionstoreexception:Factory方法[public Java . lang . object org . A
问题内容: 我长期困扰这个问题。我有一段时间搜索此问题,但没有解决方案。 结构体: 我也用我 在我的。 请提供有关如何解决此问题的一些信息。 问题答案: 从中删除注释并使其: 发生您的问题是因为的特化,这意味着Spring将尝试创建注入实例。由于superclass()不是通用的,因此您无法将其向下转换为,因此这行代码将失败(与尝试使用手动实例化该代码的方式相同): 专业课仍应使用注释。当spri
问题内容: 我使用泛型创建了接口和类的层次结构,并弄乱了所有内容。 最顶级的类是AbstractJpaEntity,它由所有域实体扩展 ProductTypeDomain类类似于标记类,用于分离出几个表实体。 接口“ GenericDao”的定义 抽象类GenericDaoImpl(此类具有通用功能,例如persist,merge) 接口ProductTypeDao Spring存储库类Produ
MainActivity.java 对不起,我的英语很差。
问题内容: 我是Java Reflection的新手。 我检查了很多论坛,但找不到有效的解决方案。 错误: 当我试图从数据库获取对象时: 方法声明 二级扩展 实体类: 并在控制器中调用方法: 这很奇怪,因为我有其他实体可以在没有任何运行时错误的情况下使用该方法。这是该实体: 并在其他控制器中调用该方法: 此代码有效。我看不到模型和控制器之间的任何区别。 有人可以帮我指出我的错误吗? -------
问题内容: 我有。我想使用获得最大结果。这是我的代码: 这是我的: 现在我得到了。怎么了? 问题答案: 您的错误可能在以下行中: 其中query.list()返回BigInteger列表而不是Long列表。尝试将其更改为。