Spring Boot サービスからの発信リクエストにいくつかの HttpHeaders を自動的に挿入する ClientHttpRequestInterceptor 実装を作成しました。
私がサポートする予定だったヘッダーの 1 つは、この要求を送信しているソース アプリケーションを示すことです。このために、「spring.application.name」アプリケーション プロパティをプライベート変数に注入し、そのプライベート変数を使用して HttpHeader を設定しました。
public class ClientHeaderPropagationInterceptor implements ClientHttpRequestInterceptor {
@Value("${spring.application.name}")
private String appName;
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
log.debug("ClientHeaderPropagationInterceptor in action");
// Set source header for traceability between microservices
log.debug("Setting request source to {}", appName);
requestHeaders.set("source", appName);
return execution.execute(request, body);
}
}
しかし、上記の appName 変数で「null」値を取得しています。これは、プロパティを注入する前に Interceptor が初期化されるためですか? アドバイスをいただければ幸いです。
Interceptor クラスは、RestTemplate が注入される @Bean から RestTemplate ライフサイクルに挿入されます。
@Configuration
public class ApplicationConfig {
...
@LoadBalanced
@Bean(name = "loadBalancedRestTemplate")
public RestTemplate getLoadBalancedRestTemplate(){
RestTemplate restTemplate = new RestTemplate(customHttpRequestFactory());
restTemplate.setErrorHandler(new CustomResponseHandler());
restTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(StandardCharsets.UTF_8));
restTemplate.setInterceptors(Collections.singletonList(new ClientHeaderPropagationInterceptor()));
return restTemplate;
}
...
}
log.debug メッセージが表示されるため、インターセプターが実行されることを確認できますが、appName 変数はまだ null です。