Настройка основанного на Spring сервлета с использованием свойств, определенных системным администратором - PullRequest
1 голос
/ 28 августа 2009

У меня есть веб-приложение, основанное на Spring и контексты приложения, applicationContext.xml и myServlet-servlet.xml содержат параметры, которые должны настраиваться системным администратором при развертывании.

Как лучше всего разрешить изменение настроек, таких как [сведения о сервере базы данных, удаленные конечные точки веб-службы и т. Д.), Не требуя редактирования содержимого WAR?

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

Возможно также есть возможность использовать сконфигурированные JNDI-ресурсы, хотя, похоже, нет реализации BeanFactoryPostProcessor , которая делает это «из коробки», так что это может быть не лучшим способом приблизиться к этому.

Какова стандартная наилучшая практика, если таковая имеется, для решения такого рода требований?

Связанные записи SO:

Как я могу указать системные свойства в конфигурации Tomcat при запуске?

Ответы [ 3 ]

1 голос
/ 28 августа 2009

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

<bean id="propertyPlaceholderConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
    <property name="locations">
            <list>
                    <value>classpath:site/properties/default/placeholder.properties
                    </value>
                    <value>file:///site/properties/${env.name}/placeholder.properties
                    </value>
            </list>
    </property>
</bean>

Адаптировано, мой ответ здесь

1 голос
/ 28 августа 2009

«Какой лучший способ разрешить изменение настроек, таких как [сведения о сервере базы данных, удаленные конечные точки веб-службы и т. Д.), Не требуя редактирования содержимого WAR?»

Единственный способ сделать это - настроить конфигурацию. Вы можете взорвать файл WAR, переместить файл .properties за пределы WAR (если он находится в CLASSPATH, Spring его найдет) или поместить изменяемые значения в базу данных.

0 голосов
/ 28 августа 2009

Если вы не хотите экспортировать файл свойств:

Я использую префикс, который представляет мою среду развертывания в моих свойствах. Пример:

#Test url
test.url=http://test.url.com

#Production URL
prod.url=http://prod.url.com

Я определил системное свойство с именем "entorn" в каждой среде (аргумент -D для вызова jvm в сценарии запуска сервера приложений). Значение этого свойства - «test» в моей тестовой среде и «prod» в моей производственной среде.

Затем я определил мой bean-компонент "propertyConfigurer":

<bean id="propertyConfigurer" class="es.indra.ccma.config.EnvironmentPropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:ccma.properties</value>
        </list>
    </property>
</bean>

Код EnvironmentPropertyPlaceholderConfigurer:

package es.indra.ccma.config;

import java.util.Properties;

import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;

public class EnvironmentPropertyPlaceholderConfigurer extends
        PropertyPlaceholderConfigurer {

    private String environment;
    final private static String ENV_SYSTEM_PROPERTY = "entorn";

    public EnvironmentPropertyPlaceholderConfigurer() {

        environment = System.getProperty(ENV_SYSTEM_PROPERTY);
        if (environment == null) {
            //default environment
            environment = "test";
        }
    }
    protected String resolvePlaceholder(String placeholder, Properties props) {

        final String envPlaceholder = environment + "." + placeholder;
        if (props.containsKey(envPlaceholder)) {
            return props.getProperty(envPlaceholder);
        } else {
            return props.getProperty(placeholder);
        }
    } 
}

Если вы выполняете свой код в среде «test» и хотите получить значение свойства «url», propertyConfigurer ищет файл «test.url» в ваших файлах свойств, и если свойство «test.url» не найдено он будет искать свойство "url".

Это не моя идея Я следовал этому уроку , чтобы подтвердить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...