具有动态值的 Spring REST 拦截器

Mub*_*bin 5 java rest spring interceptor

简而言之,问题是:在 RestTemplate Autowired 之后,如何将动态值传递给 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);
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我使用上面的拦截器配置 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;
}
Run Code Online (Sandbox Code Playgroud)

请看看我创建拦截器的方式。MY-CUSTOM-HEADER 是一个常量,但 MY-DYNAMIC-VALUE 可以针对每个请求进行更改。如何让拦截器获取动态值?

PS:这是一个独立的 Spring 应用程序(不是 Web)。它是一种用于进行 REST 调用的客户端库。

Raf*_*ele 0

如果标头值可以在每个请求中更改,则RestTemplatebean 应该具有request作用域

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

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

  • 您可以使用 `@Scope("request")` 然后 (2认同)