2

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 です。

4

1 に答える 1