如何从外部 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 对象并将其保存到表中

如何读取 save.txt 文件并将其设置为标签

如何使用 groovy 读取文件并将其内容存储为变量?

使用 Async Task 读取电话联系人并将其设置为 AutoCompleteTextView 的适配器

如何在 Web API 中将 HttpResponse 设置为 HttpResponseMessage