Задать Системное Свойство С Помощью Файла Конфигурации Spring
конфигурация:
Весна 2.5, Junit 4, Log4j
Расположение файла log4j указывается из системного свойства
${log.location}
во время выполнения системное свойство устанавливается с параметром-D java. Все хорошо.
Проблема / Что Мне Нужно:
Во время модульного теста системное свойство не задано, а расположение файла не разрешено.
Приложение использует Spring, хотел бы просто настроить Spring на set система свойство.
Подробнее:
Требование только для конфигурации. Не удается ввести новый код Java или записи в IDE. В идеале, одна из реализаций конфигурации свойств Spring может справиться с этим-я просто не смог найти правильную комбинацию.
эта идея близка, но нужно добавить Java-код:
Spring SystemPropertyInitializingBean
любая помощь там? Любые идеи приветствуются.
4 ответа:
вы можете добиться этого с помощью комбинации двух MethodInvokingFactoryBeans
создайте внутренний компонент, который обращается к системе.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>
(вы, конечно, можете использовать только один боб и целевую систему.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\
в комментариях был запрос на пример 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>
Весенняя партия имеет SystemPropertyInitializer класс, который может быть использован для установки системного свойства немного более кратко, например, чтобы заставить JBoss logging использовать 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"
Не забудьте добавить атрибут "зависит от", чтобы сначала установить системное свойство.
для более краткого подхода попробуйте:
<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'}}"/>