Мне нужно, чтобы некоторые свойства вычислялись вручную. Эти свойства касаются конфигурации сети: маска и адрес подсети, широковещательный IP-адрес и т. д. Их довольно много, они различаются от сервера к серверу, а серверов у нас много. Я бы предпочел не увеличивать количество файлов свойств только по этой причине.
У меня есть компонент LocalNetwork, который предоставляет сетевые свойства, и сервис, который его создает. Теперь я хотел бы, чтобы эти свойства можно было использовать в качестве заполнителей в других свойствах, определенных в application.yaml:
Код: Выделить всё
hosts:
my-first-host: ${local-network.local.ip}
my-second-host: ${local-network.default-loopback.ip}
my-third-host: ${local-network.local.broacast-ip}
somewhere:
else:
broadcast-to: ${hosts.my-third-host}
# I could do without this double indirection,
# but it would be so nice to have it.
Я это сделал придумайте способ заставить это работать частично:
Код: Выделить всё
@Configuration
@ComponentScan
public class ServicesConfiguration {
@Bean
@Primary
public LocalNetwork networkInterface() {
return LocalNetworkBuilder.build();
}
// ...
// Lots of other things here
// ...
@Bean
public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer(LocalNetwork localNetwork) {
Properties properties = new Properties();
properties.putIfAbsent("local-network.default-loopback.ip",
localNetwork.getLoopbackDefault().ip(0).getHostAddress());
properties.putIfAbsent("local-network.local.ip",
localNetwork.getNetwork().ip(0).getHostAddress());
properties.putIfAbsent("local-network.local.broadcast-ip",
localNetwork.getNetwork().broadcastIp().getHostAddress());
PropertySourcesPlaceholderConfigurer p = new PropertySourcesPlaceholderConfigurer();
p.setProperties(properties);
return p;
}
}
- Он скрыт в конфигурационном компоненте, который не выполняет эту задачу явно.
- не разрешается, возникает ошибка Не удалось разрешить заполнитель «мой-третий-хост» в значении «${мой-третий-хост}». Однако он разрешает мой третий хост: ${local-network.local.broacast-ip.
Код: Выделить всё
broadcast-to: ${my-third-host}
N.B. Это не для серверного приложения. Это тестовое приложение, и оно будет установлено операторами на серверах. Операторы, вероятно, отредактируют внешний файл application.yaml в соответствии со своими потребностями. Вот почему очень важно сохранять файл свойств доступным для чтения.
N.B.2 Причина, по которой я предпочитаю не использовать напрямую ${local-network.local.broacast-ip, но вместо этого используйте его для инициализации my- Third-host, а затем используйте ${my- Third-host в остальной части файла приложения, это связано с читабельностью: все операторы знакомы с именами хосты, используемые в компании, поэтому им будет легче понять настройку таким образом.
Подробнее здесь: https://stackoverflow.com/questions/790 ... -placehold