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

如何在Spring中通过请求参数创建RequestScope的RestClient Bean?

实现请求作用域的RestClient注入到单例Repository

核心思路

通过请求作用域的配置Bean存储当前请求的外部API凭证,再基于该配置动态构建请求作用域的RestClient,让单例Repository通过Spring的代理机制自动获取当前请求对应的RestClient实例,避免逐层传递参数。

完整代码实现

1. 创建请求作用域的API配置类

用于存储当前请求的外部API凭证,每个HTTP请求会生成独立的实例:

@RequestScope
@Component
@Data
public class ExternalApiConfig {
    private String baseUrl;
    private String username;
    private String password;
}

注:@Data是Lombok注解,用于自动生成getter/setter,若未使用Lombok可手动编写这些方法。

2. 修改Controller存储请求参数

注入请求作用域的配置类,将请求体中的凭证参数存入该配置:

@Controller
@RequiredArgsConstructor
public class MyController {
    private final MyRepository repository;
    private final ExternalApiConfig externalApiConfig;

    @PostMapping(value = "/data", produces = "application/json")
    @ResponseBody
    public MyData data(@RequestBody Map<String, Object> body) {
        externalApiConfig.setBaseUrl(body.getOrDefault("baseUrl", "").toString());
        externalApiConfig.setUsername(body.getOrDefault("username", "").toString());
        externalApiConfig.setPassword(body.getOrDefault("password", "").toString());

        return repository.getData();
    }
}

3. 配置请求作用域的RestClient

基于请求作用域的ExternalApiConfig动态构建RestClient,确保每个请求的RestClient使用当前请求的凭证:

@Configuration
public class Config {

    @Bean
    @RequestScope
    public RestClient restClient(ExternalApiConfig config) {
        return RestClient.builder()
                .baseUrl(config.getBaseUrl())
                .defaultHeaders(httpHeaders -> 
                    httpHeaders.setBasicAuth(config.getUsername(), config.getPassword()))
                .build();
    }
}

4. Repository保持原逻辑

直接注入RestClient即可,Spring会自动处理单例Bean与请求作用域Bean的代理注入:

@Repository
@RequiredArgsConstructor
public class MyRepository {
    private final RestClient restClient;

    public MyData getData() {
        // 此处uri使用相对路径即可,baseUrl已在RestClient中配置
        return restClient
                .get()
                .uri("/endpoint")
                .retrieve()
                .body(MyData.class);
    }
}

关键概念说明

  • 请求作用域(Request Scope):Bean的生命周期绑定单个HTTP请求,每个请求生成新实例,请求结束后销毁,适合存储请求级别的上下文数据。
  • 代理(Proxy):Spring为单例Bean注入请求/会话作用域Bean时,会生成代理对象,运行时自动获取当前请求对应的Bean实例,解决单例与请求作用域的生命周期冲突。
  • 依赖注入(DI):Spring容器负责Bean的创建与依赖管理,无需手动实例化对象,降低代码耦合度。
  • RestClient:Spring 6及以上版本提供的轻量级HTTP客户端,用于简化REST API调用,支持灵活的配置与请求构建。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 02:15:02