2016-06-06 3 views
2

Вопрос вкратце: Как передать динамическое значение перехватчику Spring REST после того, как RestTemplate является Autowired?Перехватчик весов 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: Это автономное пружинное приложение (а не паутина). Это своего рода клиентская библиотека, которая будет использоваться для вызовов REST.

ответ

0

Если значение заголовка может изменить в каждом запросе, то RestTemplate фасоли должны иметь объем request

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

я использовал Scoped прокси-сервер, потому что считается, что класс вшита вводится в (Singleton) области по умолчанию. Также обратите внимание, что я добавил HttpRequest как зависимость в методе getRestTemplate(), предполагая, что вам нужны данные запроса для заполнения заголовка - если вы не просто удалите его и добавьте все, что захотите.

+2

Вы можете использовать '@Scope (" request ")' then – sura2k

+0

Вы уверены, что область запроса также может использоваться в приложении для не-паутины? – Mubin

0

Я не вижу использования перехватчика, если ваши заголовки динамические по запросу. Запрос на использование компонента видимости на RestTemplate может решить проблему, но он создает объект RestTemplate для каждого запроса.

Просто добавьте статический класс утилиты под названием HttpRequestHeaderUtils.java с помощью метода addHeader() и вызовите его перед вызовом методов 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); 
    } 
+0

Использование класса обертки или утилиты слишком примитивно, на мой взгляд. Я знаю, что это можно сделать, но я ищу что-то, что проще/умнее реализовать. Кроме того, обратите внимание, что заголовки динамические, но не для запроса. – Mubin

+0

Как вы получаете/устанавливаете динамические заголовки, если не по запросу? –

+0

Это совершенно случайно. Подумайте об этом как о короткоживущих жетонах. – Mubin