2016-08-18 11 views
5

2つのリソースサーバーがあります.1つは通知を電子メールで送信するためのAPIを持ち、もう1つはスケジュールされたタスクを実行します。スケジュールされたタスクが開始されると、そのタスクが開始していることをユーザーに通知するために電子メールサービスに呼び出す必要があります。どちらのサービスも認証にOAuth2を使用します。 Get tokenスケジュールされたタスクでOAuth2RestTemplateを使用するにはどうすればよいですか?


Call service

これを実現するために、私は春のセキュリティと春のブートを使用しています:それはそれを提示することによってアクセストークンを取得することができるようにスケジュールされたタスクサービスは、クライアントの資格情報を設定しているが、クライアントの資格情報ですOAuth2。タスクサービスには、Eメールサービスにコールを発信する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 

私はシステム間の認証のための静的クライアントの資格情報を使用していますので、私は私のアクセストークンを処理するために、セッションスコープのデータを使用するための十分な理由が表示されていない:私はこの例外を取得します。任意のスレッドがOAuth2RestTemplateを通じて要求を行うために使用できるシングルトンOAuth2ClientContext Beanを持つことをお勧めします。

どうすれば設定できますか?

+0

同様のことをする必要があります。クォーツスケジューラは、OAuth2で保護されたRESTサービスにアクセスするジョブを呼び出す必要があります。私はユーザー名/パスワードに基づいたOAuth2フローを使用することはできませんが、クライアントIDベースのフローは使用できません。あなたのコードを共有できますか?または助けてください? – sunitkatkar

答えて

4

非常に簡単であることが判明しました。私はシングルトンBeanを望んでいたので、私はシングルトン豆作成:私の@Configurationクラスのそれと

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

を、春は私のOAuth2RestTemplateにそれを有線、私のスケジュールされたタスクは、電子メールサービスを呼び出すことができました。良い測定のために、私は@Primaryアノテーションを追加して、このBeanがSpring Bootが作成したものよりも優先されていることを確認しました。

+0

'@ Primary'は必要ありません。 「通常の」Beanであれば、Bootの自動構成された同等のスイッチをオフにすることができます。 –

関連する問題