1

以下のように、「ticketDao」の依存関係を持つテストケースがあります。

import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Qualifier;

public class LfnSaleCancellationIntegrationTest extends BaseIntegrationTest {
  //@Resource(name = "baseTicketDao")
  private BaseTicketDao ticketDao;
  ....
  public void setTicketDao(@Qualifier("baseTicketDao") BaseTicketDao ticketDao) {
    this.ticketDao = ticketDao;
  }
}

BaseIntegrationTestはSpringテストフレームワークのAbstractJpaTestsから拡張され、Springはv3.0.5です。

このテストケースを実行すると、同様の例外が発生しました。

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No unique bean of type [com.mpos.lottery.te.gamespec.sale.dao.BaseTicketDao] 
is defined: expected single matching bean but found 2: 
[baseTicketDao, extraballTicketDao]

私のプロジェクトは長い間進化してきました。実際、この例外に初めて遭遇したとき、@Qualifierはそれを解決しました。今日まで、このプロジェクトは大きく変化しましたが、@Qaulifierと@Resourceが機能しなくなった理由がわかりません。

そして、「ticketDao」の依存関係を削除すると、テストケースは合格になります。スプリング構成の変更がこの例外の原因になるかどうか疑問に思っていますか?または...私は多くのグーグルをしましたが、他の人がそのような問題に直面したことはないようです、plsはあなたのコメントを与えます、どうもありがとう!

4

2 に答える 2

1

AbstractJPATests古い春のテストフレームワークの一部であり、の(間接的な)サブクラスであるを使用していAbstractDependencyInjectionSpringContextTestsます。デフォルトでは、インジェクションはアノテーションベースではありませんが、セッターとフィールドを検出し、タイプごとにインジェクションを試みます。新しいアノテーションベースのテストに切り替えることをお勧めします。詳細については、Springのドキュメントを参照してください。

回避策として、自動配線モードを変更してみてください。テストコンストラクターでそれをとして呼び出しthis.setAutowireMode(AutowireCapableBeanFactory.AUTOWIRE_BY_NAME)、フィールドの名前をbaseTicketDaoに変更し、setterを削除します。

于 2013-03-26T10:54:37.063 に答える
0

私はその理由を知っていました。私の新しいプロジェクトでは、春の構成ファイルにcontext:component-scanのステートメントがあり、デフォルトで4つのBeanPostProcessorsが登録されます。

  • AutowiredAnnotationBeanPostProcessor(@Autowired)
  • RequiredAnnotationBeanPostProcessor(@Require)
  • CommonAnnotationBeanPostProcessor(JSR-250アノテーション、@ Resource、@ PostConstructなど、@ WebServiceRef)
  • PersistenceAnnotationBeanPostProcessor(@PersistenceUnitおよび@PersistenceContext)

私の古いプロジェクトでは、デフォルトのBeanPostProcessor(internalAutoProxyCreator)のみが登録されています。私の理解では、AutowiredAnnotationBeanPostProcessorは常にタイプごとに配線されます。とにかく、context:component-scanを削除すれば、私のテストケースは合格することができます。

実際、私はすべてのテストケースをスプリングテストコンテキストフレームワークに移行しました。context:component-scanを指定する必要があります。そうしないと、@ Autowired、@ Resourceなどのアノテーションが無視され、それらのNullPointerExceptionが自動的に多数発生します。注入された依存関係。

注:<context:annotation-config/>これらの4つのBeanPostProcessorも登録します。

于 2013-04-01T07:34:21.260 に答える