[SPRING] java.lang.Class는 java.lang.reflect.ParameterizedType에 캐스트 할 수 없습니다.
SPRINGjava.lang.Class는 java.lang.reflect.ParameterizedType에 캐스트 할 수 없습니다.
나는이 문제에 오랫동안 붙어있다. 언젠가는이 문제를 수색했지만 해결책은 없었습니다.
구조:
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
내 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
해결법
-
==============================
1.AbstractGenericDAO에서 @Repository 주석을 제거하고 추상화합니다.
AbstractGenericDAO에서 @Repository 주석을 제거하고 추상화합니다.
public abstract class AbstractGenericDAO<T extends Serializable, ID extends Serializable> implements GenericDAO<T, ID>
@Repository가 @Component의 특수화이므로 Spring에서 AbstractGenericDAO 인스턴스를 생성하려고 시도하기 때문에 문제가 발생합니다. AbstractGenericDAO 수퍼 클래스 (Object)는 generic이 아니므로 Type을 ParameterizedType으로 다운 캐스트 할 수 없으므로이 코드 줄은 실패합니다 (새 AbstractGenericDAO ()로 수동으로 인스턴스화하려는 경우와 동일한 방식으로 실패합니다) ) :
this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
특수 클래스 ShlkActiveWorkflowDAOImpl에는 여전히 @Repository가 주석으로 표시되어야합니다. 스프링이이 클래스의 인스턴스를 만들려고 할 때 AbstractGenericDAO 생성자에 대한 암시 적 호출이 발생하지만 이번에는 위에서 언급 한 코드 행이 예상대로 실행됩니다. 이것은 getClass ()가 generic AbstractGenericDAO의 하위 클래스 인 ShlkActiveWorkflowDAOImpl.class를 반환하기 때문에 발생합니다 (따라서 ParameterizedType으로 다운 캐스트가 작동 함).
ShlkActiveWorkflowDAOImpl은 AbstractGenericDAO
을 확장하므로 실제 유형 ShlkActiveWorkflow는 런타임에 올바르게 반영됩니다. 이 메서드는 AbstractGenericDAO 생성자에 Class 참조를 전달하지 않도록하는 해결 방법으로 알려져 있습니다. Abstract GenericDAO에서 @Autowired 어노테이션에 대해 걱정한다면, 그렇게하지 마십시오. Spring은 하위 클래스 중 하나의 인스턴스를 삽입 할 때 모든 것을 올바르게 연결합니다.
-
==============================
2.
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];
from https://stackoverflow.com/questions/11067512/java-lang-class-cannot-be-cast-to-java-lang-reflect-parameterizedtype by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 유효성 검사기에 서비스 자동 연결 (0) | 2019.02.05 |
---|---|
[SPRING] Spring MVC에서 드롭 다운 상자를 채우는 방법 (0) | 2019.02.05 |
[SPRING] Spring RestTemplate이 XmlConverter를 사용하도록 강제 실행 (0) | 2019.02.05 |
[SPRING] Spring 3 주석 - HibernateDaoSupport - 저장소가 세션 팩토리를 필요로 함 (0) | 2019.02.05 |
[SPRING] Spring & annotation을 사용하여 속성 주입 @Value (0) | 2019.02.05 |