2011-08-11 7 views
1

Spring Beanファクトリで管理されていないオブジェクトに@Inject経由で参照を挿入するためにSpring-AOPサポートを使用しています。たとえば:リリースビルドでのみ動作していないMavenのSpring-AOP @Inject

@Configurable(preConstruction=true) 
class DefaultContent implements Content 
    { 
    @Inject @Nonnull 
    private Site site; 

    @Inject @Nonnull 
    private ModelFactory modelFactory; 

    public DefaultContent (final @Nonnull FileObject file) 
     { 
     resource = modelFactory.createResource(file); // <--here 
     } 

私は静的コード製織を使用しています。

私はすべての関連技術をよく知っていると思いますが、これは実際に正常に動作します。通常の開発サイクル(Mavenの場合)です。昨日私はリリース(Mavenリリースプラグイン付き)を用意しました。リリースのバイナリは、ここで 'here'とマークされた行にNPEを取得するため、注入に失敗したようです。

昨日まで私のプロジェクトはスナップショットモード(1.0-ALPHA-2-SNAPSHOT)になっていました。スナップショット作業のバイナリ。 1.0-ALPHA-2のバイナリは、リリースモードではありません。次のスナップショットのバイナリ、1.0-ALPHA-3-SNAPSHOTが再び動作します。唯一のブラックホールはリリースされたバイナリです。 diffを見ると、SNAPSHOTとリリースの違いはありませんが、モジュールのバージョンラベルは違います。

これまでのところ、「plain」ビルドのタグ付きソースから1.0-ALPHA-2を再作成してもバイナリがバグであるため、Mavenリリースプロセス中に問題が発生していることは除外しました(つまり、mvn clean installだけです)。また、1.0-ALPHA-2と1.0-ALPHA-3-SNAPSHOTのコードを比較して、エラーのあるクラスの有効なソース(ポストウェーブ)を調べるためにJavaデコンパイラを使用しました。彼らは同じように見えます。最後に、私はバイナリ(Jetty内で実行されている.warファイル)を比較しました。同じ項目が含まれています(つまり、依存性が欠落していない、唯一の違いは別のバージョンのjarファイルです)。

この時点で私は他に何を試していいのかわからないので、このバグをよく理解するにはいくつかの提案が必要です。

+0

実際に泉に注射を依頼しましたか? IIRCではデフォルトではありません(そして、@ Beanを見るだけですが、Springにオブジェクトを導入してBeanに変換するために '@ Configuration'を使うことができます)。 –

+0

私が言ったように、MavenモジュールがSNAPSHOTとしてバージョン管理されているとき、コードは完全に機能します。 beans.xmlには、注射をオンにするのに必要なものがすべてあります(そうでなければ、スナップショットではうまくいきません)。 –

答えて

0

私が記載されている依存関係(だけでなく、いくつかの他)を変更することにより、それを回避することができたに:

@Inject @Nonnull 
private Provider<Site> site; 

プロバイダは

として延期されなければならないという、「怠惰」依存関係を注入する方法です私は自分自身にいくつかの解決不能な循環依存関係を検出したとして、私はすでに過去に私のプロジェクトでは、いくつかのプロバイダー<>依存関係を使用していた
site.get() 

注 - 通常、明示的に春はそれらについてのエラー通知を行います。だから、これは私のポストへの完全な答えではありません - スナップショットを実行するとき、この変更は必須ではないことを考慮してください。 SNAPSHOT /リリースバージョンなど、プロジェクトの無関係な詳細が変更されたときに、解決不可能な循環依存関係を解決できない、解決できない...

私はSpring AOPでいくつかのバグを引き起こしたと思います。それでも、プロバイダ<>事は私に全く受け入れられます。

関連する問題