<context:property-placeholder
location="a.properties,b.properties"
ignore-unresolvable="true"/>
результат: загружаются оба файла свойств
<context:property-placeholder
location="${properties_location}"
ignore-unresolvable="true"/>
где properties_location - это "a.properties, b.properties"
result: Exception in thread "main" org.springframework.beans.factory.BeanInitializationException: Could not load properties; nested exception is java.io.FileNotFoundException: class path resource [a.properties,b.properties] cannot be opened because it does not exist
edit: ${properties_location}
устанавливается следующим образом:
System.getProperties().setProperty("properties_location", "a.properties,b.properties");
ApplicationContext ctx = new GenericXmlApplicationContext("context.xml");
...
Как я могу инициализировать мое приложение вторым способом? чтобы весь путь к файлу свойств был определен в заполнителе.
Из источника анализатора элемента элемента property-placeholder
.
String location = element.getAttribute("location");
if (StringUtils.hasLength(location)) {
String[] locations = StringUtils.commaDelimitedListToStringArray(location);
builder.addPropertyValue("locations", locations);
}
Сначала выбирается местоположение, если оно имеет значение, оно преобразуется в String[]
. Служба преобразования Springs заботится о замене любых заполнителей в String[]
. Но в тот момент properties_location
заполнитель только один элемент в массиве и получает решение о a.properties,b.properties
без дальнейшей обработки.
Так что на данный момент это невозможно с заполнителями, я боюсь.
Одна вещь, которая может работать, - использовать SpEL, если она всегда будет системным свойством, вы можете использовать #{systemProperties['properties_location']}
для разрешения значения. Это должно быть разрешено прежде всего.
Вы должны изменить это на:
<context:property-placeholder
location="classpath:a.properties,
classpath:b.properties"
ignore-unresolvable="true"/>
Вы не можете использовать заполнитель свойств в качестве значения в заполнитель-заполнителе заполнителя. Это похоже на высказывание: "Эй, разрешите местозаполнитель для расположения всех свойств, а затем вы можете начать разрешать свойства!".
Логически это просто доцент имеет смысл. Недавно я экспериментировал с резолюцией о замене весенней собственности, и наткнулся на этот же вопрос. Я попытался использовать два конфигуратора заполнителя свойств, один для разрешения местоположения свойств для второго, а второй для устранения остальных свойств. Разумеется, эта функция дозирования связана с тем, как весна инициализирует его бобы.
Поскольку конфигуратор заполнителя свойств является обработчиком столбцов, если у вас есть более одного из них, они получают инициализацию и построение в одно и то же время, поэтому ничего не знают о свойствах других объектов при строительстве
редактировать
Учитывая, что местоположение объекта является системным свойством, которое вы могли бы иметь:
System.getProperties().setProperty("properties_location_a", "classpath:/a.properties");
System.getProperties().setProperty("properties_location_b", "classpath:/b.properties");
А потом в вашей весне content.xml:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreUnresolvablePlaceholders" value="true"/>
<property name="locations">
<list>
<value>${properties_location_a}</value>
<value>${properties_location_b}</value>
</list>
</property>
</bean>
String
вString[]
. Итак, то, что вы хотите, в настоящее время невозможно.