2017-06-22 67 views
0

我知道錯誤是自我解釋的,但是當我從構造函數中將rest模板的設置移除到@Autowired @Qualifier(「myRestTemplate」 )私人RestTemplate restTemplate,它的工作原理。在同一類中創建Bean的Spring Autowire會導致:請求的bean當前正在創建中錯誤*

只是想知道如何在構造函數中做到這一點,如果相同的類有我試圖自動裝配的bean定義?

org.springframework.beans.factory.BeanCurrentlyInCreationException: 錯誤創建名爲 'XXX' 豆:當前請求的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方法在所謂的精簡版模式被處理。

我不知道你爲什麼想這樣做。如果你的xxx類控制着RestTemplate的實例化,沒有太多理由不要在構造函數中自己做(除非你的意思是將它暴露給上下文的其餘部分,但是有更好的解決方案)。

在任何情況下,對於Spring來調用您的getRestTemplate工廠方法,它需要一個xxx的實例。要創建一個xxx的實例,它需要調用其構造函數,該構造函數的期望值爲RestTemplate,但您的RestTemplate目前正在構建中。

您可以通過製作getRestTemplatestatic來避免此錯誤。

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

在這種情況下,Spring並不需要一個xxx實例調用getRestTemplate工廠方法。

+0

是的,「但是後來有更好的解決方案」驅使我在@configuration中移動Bean的創建,現在工作正常,非常感謝。 – Abhijeet