2017-06-22 12 views
0

エラーは自明ですが、コンストラクタから@Autowired @Qualifier( "myRestTemplate")への残りのテンプレートの設定を削除すると、 )private RestTemplate restTemplate、それは動作します。同じクラスのBean作成によるSpring Autowireの結果:リクエストされたBeanが現在作成中Error *

同じクラスに私がautowireしようとしているもののbean定義がある場合、コンストラクタでそれをどうやって行うことができますか?

org.springframework.beans.factory.BeanCurrentlyInCreationException: エラーが 'XXX' の名前を持つBeanを作成:要求Beanが 作成中です:解決できない循環参照がありますか?定期@Component注釈付きクラスの

@Component 
public class xxx { 

private RestTemplate restTemplate; 

@Autowired 
public xxx(@Qualifier("myRestTemplate") RestTemplate restTemplate) { 
    this.restTemplate = restTemplate; 
} 

@Bean(name="myRestTemplate") 
public RestTemplate getRestTemplate() { 
    return new RestTemplate(); 
} 

} 
+0

問題ではありません。上記の実装はそのまま動作するはずです。コンストラクタから '@ Autowired'を削除してください。 –

+0

@KrishnaKuntala私はデフォルトコンストラクタを持っていないので動作しませんので、このコンストラクタでAutowiredが必要です。 – Abhijeet

+0

あなたのポイントを得ました。なぜあなたは '@ Bean'を同じクラスに作成したいのですか? 'ApplicationInitializer'(' @ Configuration'という名前のクラス)クラスで初期化できますか? –

答えて

1

@Bean方法はLITE-モードとして知られているもので処理されています。

私はなぜこれをやりたいのか分かりません。 xxxクラスがRestTemplateのインスタンス化を制御している場合は、コンストラクターでそれを実行しない理由はあまりありません(ただし、それを他のコンテキストに公開するのではなく、より良い解決策があります)。

いずれの場合でも、SpringがgetRestTemplateファクトリメソッドを呼び出すためには、xxxのインスタンスが必要です。 xxxのインスタンスを作成するには、RestTemplateが必要なコンストラクタを呼び出す必要がありますが、現在はRestTemplateが構築中です。

このエラーは、getRestTemplatestaticとすることで回避できます。この場合

@Bean(name="myRestTemplate") 
public static RestTemplate getRestTemplate() { 
    return new RestTemplate(); 
} 

、春getRestTemplateファクトリメソッドを呼び出すことxxxインスタンスを必要としません。

+0

はい、 "しかし、より良い解決策があります"という設定でBeanの作成を動かすことができました。 – Abhijeet

関連する問題