如何从外部 api 读取属性并将其设置为 springboot 中的应用程序上下文以使其全局可用?
Posted
技术标签:
【中文标题】如何从外部 api 读取属性并将其设置为 springboot 中的应用程序上下文以使其全局可用?【英文标题】:How to read a property from external api and set it to application context in springboot to make it available globally? 【发布时间】:2021-11-09 20:24:04 【问题描述】:我必须在我的 Springboot java 应用程序中的多个位置调用外部 api。外部 api 将始终返回一个静态常量 String 值。
请在下面找到示例代码,以更好地解释我的意图以及我希望在一天结束时实现的目标
我的示例代码使用 RestTemplate 调用外部 api 来检索字符串值。
ResponseEntity<String> result = new RestTemplate().exchange("http://localhost:7070/api/test/id",
HttpMethod.GET, entity, String.class, id);
JSONObject jsonResponse = new JSONObject(result.getBody());
String reqVal = jsonResponse.getString("reqKey");
现在,我的意图是让这个字符串在应用程序中全局可用,以避免多次调用这个 api。
我正在考虑在应用程序启动时调用这个外部 api,并在 Springboot 应用程序上下文中设置这个 String 值,以便可以从应用程序的任何地方检索它。
任何人都可以建议,我怎样才能达到我的上述要求? 或者还有其他更好的选择吗?
提前致谢!
【问题讨论】:
我会将它存储在 Spring 管理的 Bean 的内存中,该 Bean 调用外部 API,然后允许任何其他 Spring 管理的 Bean 从该组件中获取它。这可以接受吗? 对我来说听起来是个好主意,并且可能在该 bean 中的 @PostConstruct 注释方法中调用 API。 感谢 Joao 和 Chris。你的两个建议都很有帮助 【参考方案1】:我会将它存储在调用外部 API 的 Spring 管理的 Bean 中的内存中,然后允许任何其他 Spring 管理的 Bean 从该组件中获取它。
@Service
public class ThirdPartyServiceClient implements ApplicationListener<ContextRefreshedEvent>
private String reqKey = null;
@Override
public void onApplicationEvent(ContextRefreshedEvent event)
(...)
ResponseEntity<String> result = new RestTemplate()
.exchange("http://localhost:7070/api/test/id", HttpMethod.GET, entity, String.class, id);
JSONObject jsonResponse = new JSONObject(result.getBody());
this.reqKey = jsonResponse.getString("reqKey");
public String getKey()
return reqKey;
现在您只需将ThirdPartyServiceClient
Spring-managed bean 注入任何其他bean 即可调用getKey()
方法。
【讨论】:
感谢@João Dias。你的建议很有帮助。它解决了我的问题。 不客气!以上是关于如何从外部 api 读取属性并将其设置为 springboot 中的应用程序上下文以使其全局可用?的主要内容,如果未能解决你的问题,请参考以下文章
如何读取从 API 检索到的 JSON 并将其保存到 CSV 文件中?
如何从单个文件中读取不同的模式 json 对象并将其保存到表中