Установить системное свойство с помощью конфигурационного файла Spring - PullRequest
56 голосов
/ 27 июля 2010

Конфигурация
Spring 2.5, Junit 4, Log4j
Расположение файла log4j указывается в системном свойстве

${log.location}

Во время выполнения системное свойство устанавливается с опцией -D java. Все хорошо.

Проблема / Что мне нужно:
Во время модульного тестирования системное свойство не установлено, а местоположение файла не определено.
Приложение использует Spring, просто хочет настроить Spring на установить системное свойство.

Подробнее:
Требование только для конфигурации. Невозможно ввести новый код Java или записи в IDE. В идеале, одна из реализаций конфигурации свойств Spring могла бы справиться с этим - я просто не смог найти правильную комбинацию.

Эта идея близка, но нужно добавить код Java:
Spring SystemPropertyInitializingBean

Есть какая-нибудь помощь? Любые идеи приветствуются.

Ответы [ 4 ]

92 голосов
/ 12 сентября 2011

В комментариях для Spring 3 был запрос о том, как это сделать.

<bean id="systemPrereqs"
    class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetObject" value="#{@systemProperties}" />
    <property name="targetMethod" value="putAll" />
    <property name="arguments">
        <!-- The new Properties -->
        <util:properties>
            <prop key="java.security.auth.login.config">/super/secret/jaas.conf</prop>
        </util:properties>
    </property>
</bean>
55 голосов
/ 27 июля 2010

Этого можно достичь с помощью комбинации двух MethodInvokingFactoryBeans

Создание внутреннего компонента, который обращается к System.getProperties, и внешнего компонента, который вызывает метод putAll для свойств, полученных внутренним компонентом:

<bean
    class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property
        name="targetObject">
        <!-- System.getProperties() -->
        <bean
            class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
            <property name="targetClass" value="java.lang.System" />
            <property name="targetMethod" value="getProperties" />
        </bean>
    </property>
    <property
        name="targetMethod"
        value="putAll" />
    <property
        name="arguments">
        <!-- The new Properties -->
        <util:properties>
            <prop
                key="my.key">myvalue</prop>
            <prop
                key="my.key2">myvalue2</prop>
            <prop
                key="my.key3">myvalue3</prop>

        </util:properties>
    </property>
</bean>

(Конечно, вы можете использовать только один bean-компонент и целевой System.setProperties (), но тогда вы замените существующие свойства, что не очень хорошая идея.

В любом случае,вот мой маленький метод испытаний:

public static void main(final String[] args) {

    new ClassPathXmlApplicationContext("classpath:beans.xml");

    System.out.println("my.key: "+System.getProperty("my.key"));
    System.out.println("my.key2: "+System.getProperty("my.key2"));
    System.out.println("my.key3: "+System.getProperty("my.key3"));

    // to test that we're not overwriting existing properties
    System.out.println("java.io.tmpdir: "+System.getProperty("java.io.tmpdir"));
}

А вот и вывод:

my.key: myvalue
my.key2: myvalue2
my.key3: myvalue3
java.io.tmpdir: C:\DOKUME~1\SEANFL~1\LOKALE~1\Temp\
10 голосов
/ 03 декабря 2012

Spring Batch имеет класс SystemPropertyInitializer , который можно использовать для более краткой установки системного свойства, например, заставить логирование JBoss использовать slf4j (с Spring JPA):

<bean id="setupJBossLoggingProperty"
    class="org.springframework.batch.support.SystemPropertyInitializer"
    p:keyName="org.jboss.logging.provider" p:defaultValue="slf4j"/>

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
    depends-on="setupJBossLoggingProperty"

Не забудьте добавить атрибут «зависящий от», чтобы принудительно установить системное свойство первым.

3 голосов
/ 28 мая 2015

Для более краткого подхода попробуйте:

<beans ... xmlns:p="http://www.springframework.org/schema/p" ...    
    <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" 
        p:targetObject="#{@systemProperties}" p:targetMethod="setProperty"
        p:arguments="#{{'org.jboss.logging.provider','slf4j'}}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...