2015-09-30 1 views
3

У меня есть рабочий клиент OAuth2RestTemplate (я использую spring-security-oauth2 2.0.7.RELEASE). Теперь я хотел бы открыть/обернуть его как AsyncRestTemplate, чтобы воспользоваться асинхронной семантикой ListenableFuture. К сожалению, следующий простой подход не работает:Вывод OAuth2RestTemplate как AsyncRestTemplate

// instantiate and configure OAuth2RestTemplate - works 
OAuth2RestTemplate oAuth2RestTemplate = new OAuth2RestTemplate(...); 

// wrap sync restTemplate with AsyncRestTemplate - doesn't work 
AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate(
    new HttpComponentsAsyncClientHttpRequestFactory(), oAuth2RestTemplate); 

Как я могу получить клиент OAuth2 Rest для моего HTTP сервис как AsyncRestTemplate?

ответ

3

Хорошо, я смог сделать работу AsyncRestTemplate вручную, установив заголовок «Авторизация» с помощью accessToken из OAuth2RestTemplate; вот конфигурация Java Spring для этого:

@Bean 
public OAuth2RestTemplate restTemplate() { 
    ClientCredentialsResourceDetails details = new ClientCredentialsResourceDetails(); 
    // configure oauth details 

    OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(details); 
    restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory()); 

    return restTemplate; 
} 

@Bean 
public AsyncRestTemplate asyncRestTemplate(final OAuth2RestTemplate oAuth2RestTemplate) { 
    HttpComponentsAsyncClientHttpRequestFactory asyncRequestFactory = new HttpComponentsAsyncClientHttpRequestFactory() { 
     @Override 
     public AsyncClientHttpRequest createAsyncRequest(URI uri, HttpMethod httpMethod) throws IOException { 
      AsyncClientHttpRequest asyncRequest = super.createAsyncRequest(uri, httpMethod); 

      OAuth2AccessToken accessToken = oAuth2RestTemplate.getAccessToken(); 
      asyncRequest.getHeaders().set("Authorization", String.format("%s %s", accessToken.getTokenType(), accessToken.getValue())); 

      return asyncRequest; 
     } 
    }; 
    return new AsyncRestTemplate(asyncRequestFactory, oAuth2RestTemplate); 
} 

Я хотел было бы более простой способ, чтобы выставить сконфигурированный OAuth2RestTemplate как AsyncRestTemplate весной.

2

Вышеупомянутые работы, но я нашел намного более аккуратный способ сделать это. Регистрация Реализациям AsyncClientHttpRequestInterceptor

Пример кода:

private class Oauth2RequestInterceptor implements AsyncClientHttpRequestInterceptor 
{ 
    private final OAuth2RestTemplate oAuth2RestTemplate; 

    public Oauth2RequestInterceptor(OAuth2RestTemplate oAuth2RestTemplate) 
    { 
     this.oAuth2RestTemplate = oAuth2RestTemplate; 
    } 

    public ListenableFuture<ClientHttpResponse> intercept(HttpRequest request, byte[] body, 
     AsyncClientHttpRequestExecution execution) throws IOException 
    { 
     OAuth2AccessToken accessToken = oAuth2RestTemplate.getAccessToken(); 
     request.getHeaders() 
      .set("Authorization", String.format("%s %s", accessToken.getTokenType(), accessToken.getValue())); 
     return execution.executeAsync(request, body); 
    } 
} 

Затем зарегистрировать его вместе с AsyncRestTemplate:

@Bean 
public AsyncRestTemplate asyncRestTemplate(AsyncClientHttpRequestFactory factory, OAuth2RestTemplate restTemplate) 
{ 
    AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate(factory, restTemplate); 
    asyncRestTemplate.setInterceptors(Collections.singletonList(new Oauth2RequestInterceptor(restTemplate))); 
    return asyncRestTemplate; 
}