具有动态值的

时间:2016-06-06 08:39:02

标签: java spring rest interceptor

简而言之:如何在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调用的客户端库。

2 个答案:

答案 0 :(得分:1)

如果您的标头是每个请求的动态,我都不会看到拦截器的使用情况。 RestTemplate上基于请求的范围bean可以解决问题,但它会根据请求创建RestTemplate对象。

只需使用addHeader()方法添加一个名为HttpRequestHeaderUtils.java的静态实用程序类,并在调用RestTemplate方法之前调用它,或者将其包装在您自己的CustomRestTemplate上,以将所有RestTemplate调用委托给单个实现。

div#container div#top-div img#menu_bar_icon{ display: none; }

如果您仍想使用拦截器,则可以劫持拦截方法 通过将动态值存储为请求属性(不是干净的,与直接设置头相同)

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

答案 1 :(得分:0)

如果每个请求中的标头值都可以更改,那么RestTemplate bean应该具有request范围

@Bean(scope = DefaultScopes.REQUEST)
@ScopedProxy
public RestTemplate getRestTemplate(HttpRequest request) {
  // ...
  interceptors.add(new HeaderRequestInterceptor(
              "custom-header"
            , myDynamicVal));
  //
}

我使用了作用域代理,因为我假设封闭类是在默认(单例)范围内注入的。另请注意,我在getRestTemplate()方法中添加了HttpRequest作为依赖项,假设您需要请求数据来填充标题 - 如果您不是简单地删除它并添加您喜欢的任何内容。