使用带有外部 JSON 文件的 @PropertySource 的 Spring 属性配置

Posted

技术标签:

【中文标题】使用带有外部 JSON 文件的 @PropertySource 的 Spring 属性配置【英文标题】:Spring properties configuration using @PropertySource with external JSON file 【发布时间】:2018-04-01 13:00:17 【问题描述】:

我正在使用可以访问 keycloak 的 spring boot。我需要将 keycloak 配置保留在 keycloak.json 文件中我想使用 PropertySource 注释从 json 中获取值...

我的应用程序.yml

keycloak:
   configurationFile: "classpath:keycloak.json"

我的 keycloak.json


  "realm": "MyRealm",
  "auth-server-url": "https://keycloakURL",
....

我的班级

@Controller
@Configuration
@PropertySource("classpath:keycloak.json")
public class MyClass

@Autowired
private Environment env;

@RequestMapping(value = "/mycontroller", method = RequestMethod.GET)
    public String method(Model model) 
    env.getProperty("auth-server-url")

问题是我得到这个环境变量的空值

【问题讨论】:

在调试中运行,在 env.getProperty 上放一个断点,然后查看 env 上的属性源,看看是否有任何 keycloak.json 的源作为起点。 Load spring-boot properties from json file的可能重复 我在 application.yml 中有环境变量,即 classpath:keycloak.json 但不是 keycloak.json 文件的内容 【参考方案1】:

如果 env 为 null,则问题可能与导入有关。

org.springframework.core.env.Environment

否则,如果从环境中查询的值为空。在 Spring Boot 应用程序中,JSON 文件作为属性的配置有很大不同,请参考Example 1, Example 2

【讨论】:

【参考方案2】:

我知道使用@Value 在某种程度上不鼓励使用env.getProperty(),但我发现前者更加可靠和直接。在mkyong's great tutorial 中描述了从PropertySource 使用@Value 的正确方法

要在 @Values 中解析 $,您必须注册一个静态 XML 或注释中的 PropertySourcesPlaceholderConfigurer 配置文件。

【讨论】:

我已经尝试过你所说的@value。 @Value("$keycloak.configurationFile") 私有字符串 authServerUrl;返回 "classpath:keycloak.json" @Value("$auth-server-url") private String authServerUrl;春天不会开始.. @testeurFou 应该是@PropertySource("classpath:keycloak.json") public class MyClass @Value("$auth-server-url") private String authServerUrl; @testeurFou 我也不知道@Controller@Configuration 在同一个文件中。至少(假设它有效)建议将它们分开。【参考方案3】:

目前不可能,但我们有票https://issues.jboss.org/browse/KEYCLOAK-4942

【讨论】:

以上是关于使用带有外部 JSON 文件的 @PropertySource 的 Spring 属性配置的主要内容,如果未能解决你的问题,请参考以下文章

使用property读取外部文件内容

将带有嵌套标签的 XML 读入 Spark RDD,并转换为 JSON

使用带有外部 Json 的 jquery UI 自动完成

如何使用 Json.Net 序列化/反序列化带有自定义键的字典?

spring 配置文件 引入外部的property文件的两种方法

带有 DataTables 的表中的外部链接(jQuery 插件)