Подтвердить что ты не робот

Spring: вставка файла различных свойств в соответствии с профилем

Во-первых, некоторый контекст:

В настоящее время я работаю над проектом, в котором я использую структуру Spring в Google AppEngine (GAE) для получения некоторых данных из одной из служб Google. Для этого я использую средства Google OAuth. Для этого мне нужно использовать clientSecret и clientId, которые относятся к моему приложению. Поскольку это статические значения конфигурации, я использую Spring <util:properties> (ссылка на документацию), чтобы вставить эти значения в соответствующие классы.

Конфигурация XML:

<util:properties id="googleProperties" location="WEB-INF/google.properties" />

Использование класса:

@Value("#{googleProperties['google.data.api.client.id']}")
private String clientId;

Мой вопрос:

Как оказалось, значения clientId и clientSecret должны быть разными для производства (при развертывании в App Engine) для разработки (на моей локальной машине). Чтобы решить эту проблему без постоянного изменения значений в файле свойств при развертывании, я искал конфигурацию Spring profiles, которая позволила бы мне указать различные файлы свойств для производства и разработки. Хотя у меня есть идея, как профили Spring работают на основе в документации, я не совсем уверен, какое подходящее решение будет в этом конкретном ситуация.

Другими словами, как я могу вставлять разные файлы свойств на основе того, развертывается ли мое приложение локально или на GAE?

4b9b3361

Ответ 1

Несколько вариантов:


Системные переменные

Вы можете использовать префикс для управления свойствами, специфичными для среды, это можно сделать с помощью системных переменных:

 <util:properties id="googleProperties" 
                  location="WEB-INF/${ENV_SYSTEM:dev}/google.properties" />

В этом случае он всегда будет выглядеть:

 <util:properties id="googleProperties" 
                  location="WEB-INF/dev/google.properties" />

по умолчанию, если не установлена ​​системная переменная ENV_SYSTEM. Если он установлен на qa, например, он будет автоматически выглядеть:

 <util:properties id="googleProperties" 
                  location="WEB-INF/qa/google.properties" />

Spring Профили

Другой подход заключается в создании специфического профиля beans. Например:

<beans profile="dev">
    <util:properties id="googleProperties" 
                     location="WEB-INF/google-dev.properties" />
</beans>

<beans profile="qa">
    <util:properties id="googleProperties" 
                     location="WEB-INF/google-qa.properties" />
</beans>

Соответствующий googleProperties будет загружен в зависимости от набора профилей. Например, это загрузит WEB-INF/google-dev.properties:

GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
ctx.getEnvironment().setActiveProfiles( "dev" );
ctx.load( "classpath:/org/boom/bang/config/xml/*-config.xml" );
ctx.refresh();

Ответ 2

Вы на правильном пути, в нашем приложении у нас одинаковый сценарий, и мы используем "профили" для управления свойствами. Мы используем два конфигурационных файла один для Production, а другой для тестирования с установленными профилями.