2016-08-18 37 views
5

我有兩個資源服務器:一個具有用於通知電子郵件的API和一個運行計劃任務的API。計劃任務開始時,我想呼叫電子郵件服務以通知用戶其任務正在啓動。這兩個服務都使用OAuth2進行身份驗證。計劃任務的服務客戶端憑證設置,以便它可以通過提出它獲得訪問令牌的客戶端憑證: Get token如何在計劃任務中使用OAuth2RestTemplate?


Call service

要做到這一點,我使用Spring啓動使用Spring Security OAuth2用戶。任務服務有一個OAuth2RestTemplate來呼叫電子郵件服務。當計劃任務啓動並嘗試使用OAuth2RestTemplate時,它會嘗試獲取OAuth2ClientContext作爲sesson範圍的bean。顯然,它不會找到一個,因爲我沒有在請求線程中執行,我在後臺任務線程中運行。我得到這個異常:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 
    'scopedTarget.oauth2ClientContext': Scope 'session' is not active for the current thread; 
    consider defining a scoped proxy for this bean if you intend to refer to it 
    from a singleton 

由於我使用的系統到系統驗證靜態客戶端證書,我沒有看到一個很好的理由來使用會話作用域的數據來處理我的訪問令牌。我更喜歡有一個單獨的OAuth2ClientContext bean,任何線程都可以使用它來通過OAuth2RestTemplate發出請求。

我該如何配置?

+0

我需要做類似的事情 - Quartz調度程序需要調用將訪問受OAuth2保護的REST服務的作業。我無法使用基於用戶名/密碼的OAuth2流,但使用基於客戶端ID的流。你能分享你的代碼嗎?還是幫忙? – sunitkatkar

回答

4

結果很簡單。我想一個singleton bean,所以我創建了一個單例的bean:

@Primary 
@Bean 
public OAuth2ClientContext singletonClientContext() { 
    return new DefaultOAuth2ClientContext(); 
} 

有了,在我的@Configuration類,春季有線它給我的OAuth2RestTemplate和我的計劃任務都能夠叫出電子郵件服務。爲了更好的衡量,我添加了@Primary註釋以確保此Bean比Spring Boot創建的任何內容更優先(不確定是否需要)。

+0

你不需要'@ Primary'。一個「普通」的bean足以關閉Boot的自動配置等價物(應該有一個)。 –