我有一个正在工作的OAuth2RestTemplate客户端(我正在使用spring-security-oauth2 2.0.7.RELEASE)。现在,我想将其公开/包装为AsyncRestTemplate,以利用ListenableFuture的异步语义。不幸的是,以下简单方法不起作用:

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

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


如何获得我的HTTP服务的OAuth2 Rest客户端作为AsyncRestTemplate?

最佳答案

好的,我可以通过使用OAuth2RestTemplate中的accessToken手动设置“ Authorization”标头来使AsyncRestTemplate工作;这是Spring的Java配置:

@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);
}


我希望有一种更简单的方法在Spring中将配置的OAuth2RestTemplate公开为AsyncRestTemplate。

07-24 21:31