当前位置: 首页 > 知识库问答 >
问题:

应用程序属性未注入ClientHttpRequestInterceptor中的私有变量

龚志文
2023-03-14

我编写了一个ClientHttpRequestInterceptor实现,以自动将一些HttpHeader插入到来自Spring Boot服务的任何传出请求中。

我支持的头之一是指示发送此请求的源应用程序。为此,我将“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);
    }
}
@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;
    }
...
}

共有1个答案

夏侯承恩
2023-03-14

@value不适用于非托管spring bean。首先,您需要让它成为spring管理。尝试以下操作:

    @Bean
    public ClientHeaderPropagationInterceptor clientHeaderPropagationInterceptor() {
        return new ClientHeaderPropagationInterceptor();
    }

    @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(clientHeaderPropagationInterceptor()));
        return restTemplate;
    }
 类似资料:
  • 问题内容: 我想要一种简单的,最好是基于注释的方式,将外部属性注入到Java程序中,而无需使用spring框架() SomeClass.java application.yml 在标准库中是否有建议的方法? 问题答案: 我最终使用apache commons配置: pom.xml: src /…/ PropertiesLoader.java /src/main/resources/applicat

  • 我有不同属性的application.yml如下所示。 我使用@ConfigurationProperties将这些属性绑定到Spring组件 我将在Spring Boot控制器中注入此组件,并将此配置绑定到get-configsendpoint/控制器/配置 调用此endpoint时,期望返回 而是返回如下所示的响应 yml中的列表正在映射到Map中的对象。我们如何实现对各自数据类型的正确绑定?

  • 本文向大家介绍Python程序中的私有变量,包括了Python程序中的私有变量的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将学习Python类中的私有变量。 Python没有称为私有变量的概念。但是,大多数Python开发人员都遵循命名约定来告诉变量不是公共变量,而是私有变量。 我们必须以双下划线开头一个变量名称,以将其表示为私有变量(不是真的)。示例:-一,二等..,。 正如我们已

  • 我有一个存储库接口,它有两个实现。一个从本地存储的CSV文件读取数据,另一个从亚马逊迪纳摩数据库读取数据。我希望能够根据应用程序属性或自定义构建配置文件在我使用的实现之间切换。我通常会在运行时使用工厂来检索正确的类,但是如果可能的话,我希望通过注入来实现这一点。 我在使用Spring boot时发现了一个类似的问题,但在运行时找不到在Quarkus Spring choose bean实现中适用的

  • 我对Kotlin很陌生,并试图将一个项目从Java迁移到它。我对Kotlin的属性和它们的getters/setter以及可见性范围有点困惑。 我想要实现的是: 所以基本上我需要创建一个具有私有属性的类。此属性应由公共 getter 访问,但它不应具有 setter。此外,此属性应该是内部可变的,以便可以使用某种方法(如 更改其值。 据我所知,我不能将其声明为,因为在这种情况下,它将是完全不可变的