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

Spring Boot如何通过调用API获取密码完成Solace连接配置

实现方案

你可以通过两种常用方式实现从REST接口动态获取Solace连接密码,无需硬编码在配置文件中:


方案1:使用EnvironmentPostProcessor启动前注入密码(推荐)

该方案对原有业务代码无侵入,完全兼容Spring Cloud Stream原生配置逻辑

第一步:修改application.yaml配置

删除原有配置中硬编码的clientPassword字段,剩余配置保持不变:

spring:
  cloud:
    function:
      definition: emitSensorReading
    stream:
      poller:
        fixed-delay: 5000
      bindings:
        emitSensorReading-out-0:
          destination: sensor/temperature/fahrenheit
          binder: local-solace
      binders:
        local-solace:
          type: solace
          environment:
            solace:
              java:
                host: tcp://localhost:55555
                msgVpn: default
                clientUsername: default
                connectRetries: -1
                reconnectRetries: -1

第二步:实现环境后置处理器

自定义处理器在Spring应用上下文初始化前调用REST接口拉取密码,注入到Spring环境变量中:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MapPropertySource;
import org.springframework.web.client.RestTemplate;
import java.util.Collections;

public class SolacePasswordLoadingPostProcessor implements EnvironmentPostProcessor {
    // 密码服务地址可配置到yaml中,通过@Value注入,此处仅为示例
    private static final String PASSWORD_API_URL = "http://你的密码服务地址/getSolacePwd";
    private static final String SOLACE_PWD_ENV_KEY = "spring.cloud.stream.binders.local-solace.environment.solace.java.clientPassword";

    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        // 调用REST接口获取密码,需要鉴权可自行添加请求头
        RestTemplate restTemplate = new RestTemplate();
        String solacePassword = restTemplate.getForObject(PASSWORD_API_URL, String.class);
        // 注入环境变量,优先级高于配置文件
        environment.getPropertySources().addFirst(new MapPropertySource(
                "solaceDynamicPwdSource",
                Collections.singletonMap(SOLACE_PWD_ENV_KEY, solacePassword)
        ));
    }
}

第三步:注册后置处理器

在resources/META-INF目录下创建spring.factories文件,添加如下配置注册自定义处理器:

org.springframework.boot.env.EnvironmentPostProcessor=你的类全限定包名.SolacePasswordLoadingPostProcessor

方案2:自定义Solace连接配置Bean

如果需要更灵活的控制连接配置,可以手动创建Solace连接属性Bean:

import com.solacesystems.jcsmp.JCSMPProperties;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class SolaceCustomConfig {
    @Value("${solace.password.api.url}")
    private String passwordApiUrl;
    @Value("${solace.host}")
    private String solaceHost;
    @Value("${solace.vpn}")
    private String solaceVpn;
    @Value("${solace.username}")
    private String solaceUsername;

    @Bean
    public JCSMPProperties solaceJcsmpProperties() {
        JCSMPProperties properties = new JCSMPProperties();
        properties.setProperty(JCSMPProperties.HOST, solaceHost);
        properties.setProperty(JCSMPProperties.VPN_NAME, solaceVpn);
        properties.setProperty(JCSMPProperties.USERNAME, solaceUsername);
        // 调用接口获取密码
        RestTemplate restTemplate = new RestTemplate();
        String password = restTemplate.getForObject(passwordApiUrl, String.class);
        properties.setProperty(JCSMPProperties.PASSWORD, password);
        properties.setProperty(JCSMPProperties.CONNECT_RETRIES, -1);
        properties.setProperty(JCSMPProperties.RECONNECT_RETRIES, -1);
        return properties;
    }
}

注意事项

  • 密码接口需要鉴权的话可在RestTemplate调用时添加对应鉴权头
  • 可添加接口调用重试逻辑,避免拉取密码失败导致应用启动异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 04:00:01