如何基于请求访问Spring应用程序配置值?

时间:2019-07-03 23:54:49

标签: spring spring-boot spring-mvc

在我的一个Spring Boot应用程序中,我有一个控制器,该控制器需要从application.yml中读取以访问外部API。我在外部API中进行了组织设置,类似于github组织,并且每个组织都具有自己的客户端ID和密钥。

我的application.yml看起来像这样。

organization:
  abc:
    client:
      clientId: f29e347add73
      clientSecret: dad2404e63ec4cd   

  xyz:
    client:
      clientId: 0884340cf3e793
      clientSecret: a26ff0119d907e9      

目前,我可以像这样在控制器中获取属性值。

@Value("${organization.abc.client.clientId}")
private String abcClientId;
@Value("${organization.abc.client.clientSecret}")
private String abcClientSecret;

但是我需要做的是,如果不是对abc的请求,而是对abc的配置进行硬编码,而当对xyz进行配置时,则是针对xyz的配置。 arr2被拾取。对于我不断添加到application.yml文件中的任意数量的组织来说都是相同的。

请帮助我实现该目标。

2 个答案:

答案 0 :(得分:0)

如果您可以按以下方式重写applicaiotn.yml,则可以使用@ConfigurationProperties将其读入对象列表。

organization:
  list:
    -
      name: abc
      client:
        clientId: f29e347add73
        clientSecret: dad2404e63ec4cd
    -
      name: xyz
      client:
        clientId: 0884340cf3e793
        clientSecret: a26ff0119d907e9

创建一个类以将属性映射到对象列表:

@Service
@ConfigurationProperties(prefix="organization")
public class ConfigurationService {
    private List<Org> list = new ArrayList<>();
    //getters and setters

    public static class Org {
        private String name;
        private Client client;
        //getters and setters
    }

    public static class Client {
        private String clientId;
        private String clientSecret;
        //getter and setter
    }
}

现在,您可以像...一样访问此列表

@Autowired
ConfigurationService configurationService;

答案 1 :(得分:-1)

您可以像这样注入Environment(默认情况下由Spring Boot初始化):

@Autowired
private Environment env;

然后像这样使用它:

env.getProperty("my-property")