web-dev-qa-db-ja.com

Springエラーの取得「 'x'という名前のBeanはタイプ[y]である必要がありますが、実際にはJenkinsではタイプ[$ Proxy]でした」

私はこれをしばらくの間デバッグしてきました、そして誰かがここでいくらかの光を当てることができることを望んでいます。

JDK1.6を使用してJenkinsに追加されたMavenプロジェクトがあります。このプロジェクトでは、データベーストランザクションを処理するためにAOPを使用しています。

Jenkinsでビルドを実行すると、次の例外を除いてテストケースが失敗します。-

Caused by: org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'dataHandlerClassificationImpl': 
Injection of resource dependencies failed; nested exception is 
org.springframework.beans.factory.BeanNotOfRequiredTypeException: 
Bean named 'writerDataLocationImpl' must be of type [xxx.script.WriterData], 
but was actually of type [$Proxy17]
    ...
    ...
Caused by: org.springframework.beans.factory.BeanNotOfRequiredTypeException: 
Bean named 'writerDataLocationImpl' must be of type [xxx.script.WriterData], 
but was actually of type [$Proxy17]
    ...
    ...

DataHandlerClassificationImplクラスは次のようになります:-

@Service
public class DataHandlerClassificationImpl extends DataHandler {

    @Resource(name="writerDataLocationImpl")
    private WriterData writerData;

    ...
}       

WriterDataは、複数の実装を持つインターフェースです。

IDEから問題なくコードを実行できます。 Mavenの問題なのかJenkinsの問題なのかを判断するために、コマンドラインを使用してJenkinsのプロジェクトジョブフォルダーに移動しました。エラーなしでmvn testを実行できます。

プロキシエラーがAOPと関係があり、具象クラスではなくインターフェイスにのみ自動配線できることはわかっていますが、Jenkinsの外部でコードを正常に実行できるため、ここではそうではありません。

何か案は?ありがとう。

19
limc

上記の質問コメントからの抜粋:

JenkinsでCobertura、Sonar、またはその他のコード計測ツールを実行していますか?ご了承ください mvn siteは、生成されたsiteにCoberturaレポートを含めるように構成することもできます。

Coberturaの問題は、いくつかのカスタムインターフェイスの追加を含め、かなり重いバイトコードインストルメンテーションを実行することです。 Springが起動すると、Beanのプロキシが生成されます。 Beanに少なくとも1つのインターフェースがある場合は、標準のJavaプロキシを使用します。それ以外の場合は、クラスベースのプロキシを作成しようとします。

あなたの場合、CGLIBクラスプロキシが使用されたと思いますが、Coberturaインストルメンテーションの後、SpringはJavaプロキシにフォールバックします。依存性注入がクラス(またはCGLIBサブクラス)を予期したため、起動エラーが発生しました。

長い話を短くするには、CGLIBクラスプロキシを強制すると問題ありません。

<aop:config proxy-target-class="true"/>
43