В одном из моих приложений 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.
Пожалуйста, помогите мне, как этого добиться.
Вы можете внедрить Окружающая обстановка (инициализированный по умолчанию Spring Boot) следующим образом:
@Autowired
private Environment env;
А затем используйте его как:
env.getProperty("my-property")
Что вы подразумеваете под отдельно стоящей собственностью? Этот метод позволяет вам получить любое свойство, определенное в вашем application.yml.
@Gaustavo, если вы проверите вопрос, я имею в виду, что у меня может быть несколько ключей свойств, organization.abc.client.clientId , organization.xyz.client.clientId и так далее. Как видите, названия организаций abc и xyz — единственные переменные. Основываясь на запросе, я не хочу выбирать. Например, если запрос для abc, выбирается organization.abc.client.clientId. Точно так же, если запрос «xyz», выбирается organization.xyz.client.clientId.
Конечно, и, учитывая, что вы знаете, что это за организация, вы могли бы получить ее свойства с помощью env.getProperty("organization." + orgCode + ".client.clientId") и env.getProperty("organization." + orgCode + ".client.clientSecret"), где orgCode, например, abc, не так ли?
Если вы можете переписать свой 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;
Я не пытаюсь получить доступ к автономному свойству.