2012-02-24 3 views
1

は私のxml configです:Spring MVC @Autowireは機能していません - 循環依存ですか?ここ

<bean id="diameterClient" class="com.rory.ptspsim.diameterclient.DiameterClient" scope="singleton" init-method="start"> 
    <constructor-arg index="0"><value>${pcca.host}</value></constructor-arg>  
    <constructor-arg index="1"><value>${pcca.port}</value></constructor-arg>  
    <constructor-arg index="2" value="com.rory.djgx.message"/> 
    <constructor-arg index="3" value="com.rory.djgx.avp"/> 
    <constructor-arg index="4"> 
    <list> 
     <ref bean="asrHandler"/> 
     <ref bean="aaaHandler"/> 
     <ref bean="ceaHandler"/> 
     <ref bean="dwaHandler"/> 
     <ref bean="staHandler"/> 
    </list> 
    </constructor-arg> 
</bean> 

<bean id="asrHandler" class="com.rory.ptspsim.messagereceivers.ASRHandler"/> 
<bean id="aaaHandler" class="com.rory.ptspsim.messagereceivers.AAAHandler"/> 
<bean id="ceaHandler" class="com.rory.ptspsim.messagereceivers.CEAHandler"/> 
<bean id="dwaHandler" class="com.rory.ptspsim.messagereceivers.DWAHandler"/> 
<bean id="staHandler" class="com.rory.ptspsim.messagereceivers.STAHandler"/> 

そして、ここではASRHandlerクラスのスタートです:

public class ASRHandler implements DiameterMessageHandler 
{ 
    @Autowired 
    private DiameterClient diameterClient; 

誰もがこのありえないが働いて、なぜ任意のアイデアを持っていますか?私はハンドラクラスとDiameterClientクラスが互いに依存していることを認識していますが、Springはそれを処理しましたが、ここで

ログからのメッセージです:

org.springframework.beans.factory.BeanCreationException:のServletContextリソースで定義されたエラー名でBeanを作成する 'diameterClient' [/WEB-INF/applicationContext.xml]:することはできませんkey [0]でコンストラクタ引数を設定しながら、bean 'asrHandler'への参照を解決します。ネストされた例外はorg.springframework.beans.factory.BeanCreationExceptionです: 'asrHandler'という名前のBeanを作成中にエラーが発生しました:リソースの依存関係の注入に失敗しました。ネストされた例外はorg.springframework.beans.factory.BeanCurrentlyInCreationExceptionです:名前 'diameterClient'を持つBeanの作成中にエラーが発生しました:リクエストされたBeanは現在作成中です。解決できない循環参照がありますか?

ありがとう!

+0

他の場所でもっと有益なロギングがあります。何が間違っているか教えてくれます。 – skaffman

答えて

2

これは最も確かに循環依存です。あなたは春に投げられたBeanCurrentlyInCreationExceptionを見るべきです。

Beanは、すでにインスタンス化されているときは参照できません。問題は、コンストラクタインジェクションを使用してBeanを作成していることです。

私はこれを解決できるはずの2つのことを見ています。

  1. パッケージ名DiameterClientに基づいて、あなたがコントロールしているクラスであると仮定しています。 xxxHandlerクラスと同じように、そのクラスのすべての依存関係をオートワイヤリングすることをお勧めします。 @AutowiredList<DiameterMessageHandler>にもできるはずで、Springはそのインターフェイスを実装しているすべてbeanをリストにロードします。
  2. 豆のプロパティベース注入を使用します(constructor-arg要素の代わりに、property要素を使用します)。

EDIT:

<bean id="diameterClient" class="com.rory.ptspsim.diameterclient.DiameterClient" scope="singleton" init-method="start"/> 

<bean id="asrHandler" class="com.rory.ptspsim.messagereceivers.ASRHandler"/> 
<bean id="aaaHandler" class="com.rory.ptspsim.messagereceivers.AAAHandler"/> 
<bean id="ceaHandler" class="com.rory.ptspsim.messagereceivers.CEAHandler"/> 
<bean id="dwaHandler" class="com.rory.ptspsim.messagereceivers.DWAHandler"/> 
<bean id="staHandler" class="com.rory.ptspsim.messagereceivers.STAHandler"/> 

と、この:

public class DiameterClient { 
    @Autowired 
    private List<DiameterMessageHandler> handlers; 

    @Value("${pcca.host}") 
    private String host; 

    @Value("${pcca.port}") 
    private int port; // or String... 

    // I don't know what these other two would be...if they are autowired, or just values you would populate... 
    private String somePackage; 

    private String anotherPackage; 

    // methods go here... 
} 

その後、List<DiameterMessageHandler>は5が含まれているでしょう、あなたのファイルがある場合は

は次のようになりますあなたがあなたのディの下で定義した豆あなたのXMLのameterClient bean。順序が重要な場合は、コンテキスト内で特定の順序で指定する必要があるかもしれませんが、そうでなければ機能するだけです。

You could even take this further and annotate your classes with a Stereotype annotation (@Component most likely) and do a context:component-scan on the packages that contain these classes. That would mean even less xml declaration.

+0

ありがとうございます - あなたは1つ持っている場合、これを例と少し説明できますか? "@Autowired List することさえできるはずです。そして、Springは、そのインターフェースを実装するすべてのBeanをリストにロードします。" – Rory

+0

@Roryは私の編集をチェックアウトします。 –

+0

ありがとうございます。しかし、プロパティの設定に問題があるようです: 'java.lang.String'型の値を必要な型 'int'に変換できませんでした。ネストされた例外はjava.lang.NumberFormatExceptionです。入力文字列の場合: "$ {pcca.port}" – Rory

0

クラスに@Component @Service、@Repositoryまたは@Controller注釈を付けると、実際にDiameter ClientがASRHandlerにあるときにASRHandlerに配線されていることを忘れてしまいました。これは円形ですasrハンドラには独自の直径のクライアントが必要ですか?