контекст весны Java: свойство-заполнитель - установить пути свойств из заполнителя

1
<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");
...

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

  • 0
    Не могли бы вы указать, какую версию Spring вы используете.
  • 1
    Проблема заключается в том, что заполнитель разрешается после преобразования String в String[] . Итак, то, что вы хотите, в настоящее время невозможно.
Теги:
spring
properties

3 ответа

1

Из источника анализатора элемента элемента 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']} для разрешения значения. Это должно быть разрешено прежде всего.

  • 0
    $ {properties_location} в этом примере устанавливается как системное свойство. Я отредактировал свой вопрос.
1

Вы должны изменить это на:

<context:property-placeholder
location="classpath:a.properties,
          classpath:b.properties"
ignore-unresolvable="true"/>
  • 0
    Благодарю. Но это не отвечает на мой вопрос - как использовать эти пути в качестве заполнителя.
0

Вы не можете использовать заполнитель свойств в качестве значения в заполнитель-заполнителе заполнителя. Это похоже на высказывание: "Эй, разрешите местозаполнитель для расположения всех свойств, а затем вы можете начать разрешать свойства!".

Логически это просто доцент имеет смысл. Недавно я экспериментировал с резолюцией о замене весенней собственности, и наткнулся на этот же вопрос. Я попытался использовать два конфигуратора заполнителя свойств, один для разрешения местоположения свойств для второго, а второй для устранения остальных свойств. Разумеется, эта функция дозирования связана с тем, как весна инициализирует его бобы.

  1. Инициализация почтовых процессоров
  2. Построить их
  3. Построить все остальные компоненты

Поскольку конфигуратор заполнителя свойств является обработчиком столбцов, если у вас есть более одного из них, они получают инициализацию и построение в одно и то же время, поэтому ничего не знают о свойствах других объектов при строительстве

редактировать

Учитывая, что местоположение объекта является системным свойством, которое вы могли бы иметь:

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>
  • 0
    $ {properties_location} в этом примере устанавливается как системное свойство. Я отредактировал свой вопрос.
  • 0
    пожалуйста, смотрите мои изменения для моего решения :)
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню