2012-01-18 7 views
4

にキャストすることはできませんが、私は春+休止状態に非常に新しいです、と私は私のDAOが動作しているかどうかを確認するためのテストを実行しています。私は次のエラーをGoogleで検索すると、多くの異なる答えを得ます(主に私がチェックしたタイプミス)。私はあなたがこの上で私を助けることができる願っています:エラーテストのDAO:sun.reflect.generics.reflectiveObjects.TypeVariableImplはjava.lang.Classの

java.lang.IllegalStateException: Failed to load ApplicationContext 
     at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:308) 
     at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109) 
     at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75) 
     at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:321) 
     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:220) 
     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:301) 
     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:303) 
     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240) 
     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) 
     at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
     at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
     at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
     at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
     at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
     at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
     at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) 
     at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180) 
     at org.junit.runner.JUnitCore.run(JUnitCore.java:157) 
     at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:71) 
     at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:199) 
     at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:62) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 
    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'nominationDao' defined in file [C:\IdeaProjects\Projects\branch\dev\test-dataacess\target\classes\com\dev\test\data\dao\hibernate\NominationHibernateDAO.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.dev.test.data.dao.hibernate.NominationHibernateDAO]: Constructor threw exception; nested exception is java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class 
     at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:288) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1003) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:907) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
     at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295) 
     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
     at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580) 
     at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:900) 
     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:455) 
     at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:84) 
     at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:1) 
     at org.springframework.test.context.TestContext.loadApplicationContext(TestContext.java:280) 
     at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:304) 
     ... 27 more 
    Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.dev.test.data.dao.hibernate.NominationHibernateDAO]: Constructor threw exception; nested exception is java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class 
     at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:162) 
     at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:108) 
     at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:280) 
     ... 42 more 
    Caused by: java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class 
     at com.dev.test.data.dao.hibernate.AbstractHibernateDAO.<init>(AbstractHibernateDAO.java:50) 
     at com.dev.test.data.dao.hibernate.NominationHibernateDAO.<init>(NominationHibernateDAO.java:36) 
     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:147) 
     ... 44 more 

これを引き起こす可能性がありますか?私がAbstractHibernateDAOとNominationHibernateDAOで編集しているかどうか教えてください。

ありがとうございました!ここ

編集スニペットです:

これはAbstractHibernateDAOためのスニペットで、ライン50は、コメントである:

public abstract class AbstractHibernateDAO<T, K extends Serializable> 
     implements DAO<T, K> { 

    protected Logger logger = LoggerFactory.getLogger(this.getClass()); 

    private SessionFactory sessionFactory; 

    private Class<T> persistentClass; 

    protected AbstractHibernateDAO(SessionFactory sessionFactory) { 
     this.sessionFactory = sessionFactory; 
     this.persistentClass = (Class<T>) ((ParameterizedType) //LINE 50 
       getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 
    } 

ライン36はNominationHibernateDAOため、このスニペットにコメントが続いています

@Repository("nominationDao") 
public class NominationHibernateDAO<T extends Nomination> 
     extends AbstractHibernateDAO<T,Integer> 
     implements NominationDAO<T> { 


     @Autowired(required = true) 
     public NominationHibernateDAO(SessionFactory sessionFactory) { 
      super(sessionFactory); //LINE 36 
     } 
+0

私はコードを見る必要があります.... – hvgotcodes

+0

@hvgotcodesエラーが指し示していた箇所にスニペットを追加しました – Nimchip

+0

あなたのjunitテストでアプリケーションコンテキストをどのように読み込んでいるかを表示できますか? – dimitrisli

答えて

4

表現

getClass().getGenericSuperclass()).getActualTypeArguments()[0] 

AbstractHibernateDAO.javaTで示される)AbstractHibernateDAO第一のタイプのパラメータに置換された値をいいます。サブクラスNominationHibernateDAOで置換されたタイプは、まだ具体的ではありません。T extends Nominationですが、java.lang.Classインスタンスではありませんが、Typeインスタンス(TypeVariableImplTypeの実装です)です。

NominationHibernateDAOは、そのようなもので宣言された場合:その後、AbstractHibernateDAOコンストラクタ魔法が働くだろう

class NominationHibernateDAO extends AbstractHibernateDAO<Nomination, Integer> { ... 

class ConcreteNominationHibernateDAO 
     extends NominationHibernateDAO<ConcreteNominationSubclass> { ... 

または

new NominationHibernateDAO<ConcreteNominationSubclass>() {} 

これは、もう一度、問題をトリガしません。また、あなたは(?またはあなたもすべきである)このように宣言NominationHibernateDAOのサブクラスをインスタンス化することができます。

あなたはNominationHibernateDAOクラスがのSpring Beanとして使用されることを意味していますか?

+0

はい、そうすべきです。しかし、今私はあなたが言っていることを見ていると思う...私は、ノミネーション・エンティティを拡張する3つの異なるエンティティと、ノミネートDAOから延びる他の3つのDAOを持つという問題があると思う。私はこれを調べますが、あなたの答えは私が探していたものだったようです。ありがとうございました。 – Nimchip

+0

はちょうど私が次のことを持っているか明確にする: 'パブリック最終クラスSpecificNominationHibernateDAOはNominationHibernateDAO 拡張し、あなたが言ったことと似て異なる3つの別々のDAOにSpecificNominationDAO'を実装していますが、私は私の実装が少し間違っていたと思います。 – Nimchip

+2

これは単純に 'NominationHibernateDAO'を抽象クラスにし、ジェネリックな指名用に新しい' HibernateDAO'ビーンを持つことで解決しました。この方法で、 'NominationHibernateDAO'から拡張することができます。スーパーシンプルですが、時には何が起きているのかを見るのが難しい場合もあります。あなたの助けに感謝します。 – Nimchip

関連する問題