2011-11-14 8 views
2

私のコードが次の例外を起こす理由を理解するのに何時間も費やしました。この時点で、私は誰かが、私は希望を失っていて、私は私よりももっと賢いことができることを望んでいないのです...;)によって引き起こさSpringテストの自動発行の問題

:org.springframework.beans.factory.NoSuchBeanDefinitionException:タイプの一致するBeanを[com.ls.forecast.jpa.ForecastElementService]が依存関係のために見つかりました:この依存関係のautowire候補となる少なくとも1つのbeanが必要です。依存関係注釈:{@ org.springframework.beans.factory.annotation.Autowired(必須= true)、@ org.springframework.beans.factory.annotation.Quali fier(値=メイン)} at org.springframework.beans。 factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:924)org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:793)で org.springframework.beans.factory.support.DefaultListableBeanFactoryで 。 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.injectでresolveDependency(DefaultListableBeanFactory.java:707) (AutowiredAnnotationBeanPostProcessor.java:480)

私は運がない多くのスレッド/チュートリアルを見てきました。彼らはすべて私のものと同じ設定を持っているようです。サービスの実装に@Serviceを追加し、Qualifierを追加し、ForecastElementServiceImplが実際にインタフェースForecastElementServiceを実装していることを確認しました。

サービスインターフェース:

public interface ForecastElementService { 

Collection<ForecastElement> retrieve(String date); 
Collection<ForecastElement> retrieve(); 
} 

インタフェースの実装:

@Stateless 
@TransactionAttribute(TransactionAttributeType.REQUIRED) 
@Repository("forecastElementService") 
@Service 
public class ForecastElementServiceImpl implements ForecastElementService { 

@PersistenceContext 
protected EntityManager em; 

@Override 
@Cacheable("forecastElements") 
public Collection<ForecastElement> retrieve(String date) { 
    String sql = null; 
    if(date != null) { 
     sql = " SELECT fe FROM ForecastElement fe JOIN FETCH fe.forecastType WHERE ?1 between fe.startDate and fe.endDate"; 
    } else { 
     sql = " SELECT fe FROM ForecastElement fe JOIN FETCH fe.forecastType"; 
    } 
    final TypedQuery<ForecastElement> query = em.createQuery(sql, ForecastElement.class); 

    return query.getResultList(); 
} 

@Override 
@Cacheable("forecastElements") 
public Collection<ForecastElement> retrieve() { 

    return retrieve(null); 
} 

}

のcontext.xml:

<bean id="forecastElementService" class="com.ls.forecast.jpa.ForecastElementServiceImpl"> 
<property name="entityManagerFactory" ref="entityManagerFactory"/> 

最後にトラブルテストクラス - forecastElementService変数は例外をスローします。

@Repository 
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration({"*-context.xml"}) 
public class ModelJpaTest extends AbstractTransactionalJUnit4SpringContextTests { 

//final Logger logger = LoggerFactory.getLogger(ModelJpaTest.class); 

@Autowired 
protected ForecastElementService forecastElementService; 

@Autowired 
@Qualifier("basicDataSource") 
@Override 
public void setDataSource(DataSource dataSource) { 
    super.setDataSource(dataSource); 
} 

@Test 
public void LoadModelTest() { 
    assertNotNull("forecastElementService is null", forecastElementService); 
    Collection<ForecastElement> elements = forecastElementService.retrieve(); 
    assertTrue(elements.size() > 0); 
} 

} 

洞察力や助力は非常に高く評価されます。

私はに私のMavenプロジェクトと編集のリソース(テスト)のフォルダにModelJpaTest-のcontext.xmlを配置すると

参照@ContextConfiguration ...:

@ContextConfiguration({"/ModelJpaTest-context.xml"}) 

本当に...

今で混乱

答えて

0

少なくとも、実装クラスには 'entityManagerFactory'がありません。これがすでに問題を引き起こしているかどうかは不明です。 完全なスタックトレース(ネストされた例外を含む)と* context.xmlファイルのいくつかのスニペットを共有できますか?

EDITは: - 両方ではない - あなたのサービスのimplクラスの私は@Repositoryまたは@Serviceのいずれかを使用することをお勧めしTesting against Java EE 6 API

+0

ここに全体のcontext.xmlファイルがあります: – user899757

+0

xml全体を投稿させず、次の8時間の回答を投稿できません...私はそれを取り出しました。それを指摘してくれてありがとうが、私はまだ同じエラーが発生します。実際には、私は今私のc:ドライブ上のコンテキストファイルを指すことに決めました。そして、今は別のエラーメッセージが表示されます.Jhakkiへの返信を参照してください。 – user899757

0

:この回答を見てください。

発火しないトランザクションに関連する別の問題が発生する可能性があります。ここではhttps://jira.springsource.org/browse/SPR-5082です。回避策は、アプリケーションコンテキストXML定義ファイルでBeanを定義することです。

+0

@ContextConfigurationを設定してC:ドライブからコンテキストファイルをロードした後で、クラスファイルjavax/ejb/TransactionAttributeTypeのネイティブでも抽象メソッドでもないメソッドのコード属性が存在しない – user899757

+0

「Tは私が何らかの理由で全体のポンポンを投稿してみましょうが、ここ2、ここで遊んでいる: 'コモンズ-DBCP コモンズ-DBCP 1.4 のjavax JavaEEの-API user899757

+0

コードがありません...ということは、apiを持っていることを意味しますが、あなたは実装が欠落しています。どのアプリケーションサーバーをアプリケーションに使用しますか? jbossの場合は、依存関係: org.jboss.spec のjboss-JavaEEの-6.0 を提供 1.0.0.Final ポンポン – Wintermute

1

beanを適切に「autowire」するように、applicationContext.xmlに注釈の設定とコンポーネントのスキャンを追加する必要があります。これが完了したら、テストクラス(forecastElementService)の変数を取り除くことができました。

関連する問題