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
相关产品推荐
相关产品推荐

