12

注入が必要なフィールドで @Resource を使用して Spring の @Configurable アノテーションを介して自動依存性注入を使用しようとしています。これには、spring-agent.jar を JVM に渡すなどのセットアップが必要でした。詳細については、こちらを参照してください

それは動作します...ほとんど。Tomcat が起動すると、AspectJ の初期化メッセージが表示され、ユーザー オブジェクトは自動的に FileService 参照を取得します。

問題は、時々それが起こらないことです。完全にランダムに見えます。起動しても依存関係がインジェクトされないこともあれば、インジェクトされることもあります。以前は @Transactional が User にあることに問題がありました。競合が発生したためです。プロキシと信じています。私は JPA を使用しているため、私のユーザーは @Entity でマークされているため、現時点での最善の推測は、これが競合を引き起こしていることです。プロキシを自動プロキシできないことを読みました。競合を相殺するために、Hibernate(私のJPA impl)が使用するCGLIBjavassistを除外することについて、オンラインで見つけたいくつかのメモに従いました。

手がかり:

  • それはすべてまたは何もありません。私の @Configurable インスタンスはすべて注入されているか、どれも注入されていません。
  • DB からのエンティティのリロード (再インスタンス化) は役に立たないようです。それは機能しているかどうかのどちらかです。
  • Tomcat を何度でも再起動しても、問題は解決しません。再びサイコロを振るように見えるのは、再配備だけです。つまり、再デプロイすればうまくいくかもしれません。

何が問題なのかをどのように把握できますか? @Configurable を JPA で使用している人はいますか? 依存関係が実際に注入されていないのに、 dependencyCheck = trueがエラーをスローしないのはなぜですか?

実在物

@Entity
@Configurable(dependencyCheck = true)
@NamedQueries( { @NamedQuery(name = "User.findAll", query = "SELECT user FROM User user"),
    @NamedQuery(name = "User.findByEmail", query = "SELECT user FROM User user WHERE user.email = :email") })
public abstract class User extends BaseModel {

private static final long serialVersionUID = 7881431079061750040L;

@Id
@GeneratedValue(strategy = GenerationType.TABLE)
private Long id;

@Column(unique = true, nullable = false)
private String email;

@Basic(optional = false)
private String password;

@Resource
private transient UserEmailer userEmailer;

@Resource
private transient FileService fileService;

...

aop.xml

<!DOCTYPE aspectj PUBLIC
    "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
    <weaver options="-verbose">
        <include within="com.myapp.domain..*" />
        <exclude within="*..*CGLIB*" />
        <exclude within="*..*javassist*" />
    </weaver>
    <aspects>
        <aspect name="org.springframework.beans.factory.aspectj.AbstractInterfaceDrivenDependencyInjectionAspect" />
    </aspects>
</aspectj>

applicationContext.xml

...

<context:spring-configured />

<context:load-time-weaver />

<context:component-scan base-package="com.myapp" />

...
4

6 に答える 6

3

私には、Springでよく知られているバグの発生のように聞こえます:http://jira.springframework.org/browse/SPR-5401

いくつかのアプリケーションコンテキストでConfigurableを使用しようとしている可能性がありますか?この場合、そのうちの1つだけが依存性注入の対象になります。どちらが勝つかは、最後にロードされるアプリケーションコンテキストによって異なります。

解決?なし:-(この問題を修正する計画はありません。少なくとも、SpringSourceの男が4月にドイツで開催されたJAX会議で語ったことです。

于 2009-05-26T10:19:31.300 に答える
3

最初に、リソース、サービス、またはその他の Bean をデータ モデル クラスに依存関係として注入することは、おそらく良い考えではないと言わざるを得ません。しかし、それはデザインの問題です。

@Configurable の使い方については、Web アプリケーション、フィルター、またはサーブレットのカスタム タグのように、オブジェクトが Spring コンテキストの外部からインスタンス化される場合に使用しました。私がそれらを使用しようとした最初の方法は、あなたのようにロードタイムウィービングによるものでした. これは非常にうまく機能しましたが、デバッグ中のホットコード展開が機能しなくなるなど、いくつかの欠点がありました。

私もあなたが説明した問題を正確に経験したので、ロードタイムウィービングからコンパイルタイムに切り替えることにしました。そのため、AJDT プラグインを Eclipse にインストールし、Spring の aspecjt サポートを使用しました。それは私の問題を解決しました。

于 2009-05-20T07:11:56.593 に答える
2

明らかなものを見つけることができないので、単なる提案です-コンパイル時のウィービングを使用してみましたか?うまくいけば、それは実行時に一貫した結果につながるでしょうが、開発中はもう少し面倒になる可能性があります。

于 2009-05-18T18:12:21.070 に答える
1

展開プロセスが疑わしいようです。機能する展開を実行してから、それをディレクトリにコピーできますか。次に、機能しないものが得られるまで、別の展開を行います。(どちらの順序でも) 最後に、beyond compare などのツールを使用して、2 つの展開ディレクトリ構造とファイルを比較し、違いがあるかどうかを確認します。

幸運を祈ります。一見ランダムな問題で生産性が低下することはありません。

于 2009-05-19T13:47:52.667 に答える
1

インジェクションが何らかの理由で機能しない場合、コードで依存関係のチェックを行う方法がないため、エラーがスローされるようになりました。

そうしないと、ランダムな失敗を示すものは何も表示されません。簡単な例を抽出して確認できますか?

于 2009-05-14T12:22:57.523 に答える