简而言之:在RestTemplate自动装配后,如何将动态值传递给Spring REST拦截器?
现在详细说明:
我有一个Spring REST拦截器如下:
public class HeaderRequestInterceptor implements ClientHttpRequestInterceptor {
private final String headerName;
private final String headerValue;
public HeaderRequestInterceptor(final String headerName, final String headerValue) {
this.headerName = headerName;
this.headerValue = headerValue;
}
public ClientHttpResponse intercept(final HttpRequest request, final byte[] body, final ClientHttpRequestExecution execution) throws IOException {
HttpRequest wrapper = new HttpRequestWrapper(request);
wrapper.getHeaders().set(headerName, headerValue);
return execution.execute(wrapper, body);
}
}
然后我使用上面的拦截器配置我的RestTemplate如下:
@Bean
public RestTemplate getRestTemplate() {
List<ClientHttpRequestInterceptor> interceptors = new ArrayList<ClientHttpRequestInterceptor>();
interceptors.add(new HeaderRequestInterceptor(<<MY-CUSTOM-HEADER>>, <<MY-DYNAMIC-VALUE>>));
final RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory());
restTemplate.setInterceptors(interceptors);
return restTemplate;
}
请看我创建拦截器的方式. MY-CUSTOM-HEADER是常量,但MY-DYNAMIC-VALUE可以针对每个请求进行更改.如何让拦截器获得动态值?
PS:这是一个独立的spring应用程序(不是web).它是一种用于进行REST调用的客户端库.
解决方法:
如果你的标题是每个请求动态,我没有看到拦截器的使用.
RestTemplate上基于请求的范围bean可以解决问题,但它会为每个请求创建RestTemplate对象.
只需使用addHeader()方法添加一个名为HttpRequestHeaderUtils.java的静态实用程序类,并在调用RestTemplate方法之前调用它,或者将其包装在您自己的CustomRestTemplate上,以将所有RestTemplate调用委托给单个实现.
CustomRestTemplate extends RestTemplate{
}
HttpRequestHeaderUtils.java
public static void addHeader(final HttpRequest request, final String headerName, final String headerValue)
HttpRequest wrapper = new HttpRequestWrapper(request);
wrapper.getHeaders().set(headerName, headerValue);
}
如果您仍想使用拦截器,则可以劫持拦截方法
通过将动态值存储为请求属性(不干净,与直接设置头相同)
public ClientHttpResponse intercept(final HttpRequest request, final byte[] body, final ClientHttpRequestExecution execution) throws IOException {
HttpRequest wrapper = new HttpRequestWrapper(request);
final String dynamicHeaderValue = request.getAttribute("myDynamicHeaderValue");
wrapper.getHeaders().set(headerName, dynamicHeaderValue!=null? dynamicHeaderValue : headerValue );
return execution.execute(wrapper, body);
}