Как получить доступ к значениям конфигурации приложения Spring на основе запросов?

В одном из моих приложений Spring Boot у меня есть контроллер, которому нужно читать из application.yml для доступа к внешнему API. У меня есть настройка организации во внешнем API, аналогичная организации github, и каждая организация имеет свой собственный идентификатор клиента и секретный ключ.

Мой 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. То же самое для любого номера организации, который я постоянно добавляю в файл application.yml.

Пожалуйста, помогите мне, как этого добиться.

0
0
133
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете внедрить Окружающая обстановка (инициализированный по умолчанию Spring Boot) следующим образом:

@Autowired
private Environment env;

А затем используйте его как:

env.getProperty("my-property")

Я не пытаюсь получить доступ к автономному свойству.

user2693135 04.07.2019 02:39

Что вы подразумеваете под отдельно стоящей собственностью? Этот метод позволяет вам получить любое свойство, определенное в вашем application.yml.

Gustavo Passini 04.07.2019 03:32

@Gaustavo, если вы проверите вопрос, я имею в виду, что у меня может быть несколько ключей свойств, organization.abc.client.clientId , organization.xyz.client.clientId и так далее. Как видите, названия организаций abc и xyz — единственные переменные. Основываясь на запросе, я не хочу выбирать. Например, если запрос для abc, выбирается organization.abc.client.clientId. Точно так же, если запрос «xyz», выбирается organization.xyz.client.clientId.

user2693135 04.07.2019 07:48

Конечно, и, учитывая, что вы знаете, что это за организация, вы могли бы получить ее свойства с помощью env.getProperty("organization." + orgCode + ".client.clientId") и env.getProperty("organization." + orgCode + ".client.clientSecret"), где orgCode, например, abc, не так ли?

Gustavo Passini 05.07.2019 02:20
Ответ принят как подходящий

Если вы можете переписать свой 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;

Другие вопросы по теме