You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Feign注解硬编码属性值提取到properties配置文件

实现方案

Spring 系列注解原生支持${配置项key}占位符语法读取配置文件内容,不需要额外做复杂改造,分两步操作即可:

1. 在application.properties中定义所有抽离的配置项

把原来硬编码的服务名、请求根地址、鉴权appId全部抽到配置文件里,方便后续统一修改维护:

# 汇率服务Feign客户端配置
exchange.service.name=open-exchange
exchange.service.base-url=https://openexchangerates.org/api
# 汇率接口鉴权参数
exchange.service.app-id=9968744ca3284c3baf5d09cf1815ae6b

2. 修改Feign接口,用占位符替换硬编码值

直接在注解属性里用${配置key}引用上面定义的配置即可,Spring启动时会自动把占位符替换成配置文件里的实际值:

@FeignClient(name = "${exchange.service.name}", url = "${exchange.service.base-url}")
public interface CurrencyRatesServiceProxy {
    @GetMapping("/latest.json?app_id=${exchange.service.app-id}")
    CurrencyRatesBean retrieveLatestCurrencyRates();

    @GetMapping("/historical/{date}.json?app_id=${exchange.service.app-id}")
    CurrencyRatesBean retrieveCurrencyRatesByDate(@PathVariable String date);
}

如果你项目用的是application.yml配置文件,只需要把上述properties配置改成yml对应格式即可,注解里的占位符写法完全通用。


优化实践(可选)

上述写法已经满足配置统一管理的需求,如果要进一步降低重复代码维护成本,可以把每个接口都重复拼接的app_id参数抽成全局逻辑:

  1. 自定义Feign请求拦截器,统一给所有该客户端的请求追加app_id查询参数
@Component
public class ExchangeRateAuthInterceptor implements RequestInterceptor {
    @Value("${exchange.service.app-id}")
    private String appId;

    @Override
    public void apply(RequestTemplate template) {
        template.query("app_id", appId);
    }
}
  1. 简化Feign接口的路径写法,去掉重复拼接的app_id参数
@FeignClient(name = "${exchange.service.name}", url = "${exchange.service.base-url}")
public interface CurrencyRatesServiceProxy {
    @GetMapping("/latest.json")
    CurrencyRatesBean retrieveLatestCurrencyRates();

    @GetMapping("/historical/{date}.json")
    CurrencyRatesBean retrieveCurrencyRatesByDate(@PathVariable String date);
}

后续如果鉴权规则调整,只需要修改拦截器逻辑,不需要逐个接口改动。

内容的提问来源于stack exchange,提问作者alex_us

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 08:39:09