2010-07-26 77 views
52

配置
Spring 2.5中,JUnit 4中,Log4j的
log4j的文件位置从系统属性设置系统属性Spring配置文件

${log.location} 

在运行时,系统属性设置与规定 - D java选项。一切都很好。

问题/我需要什么:
在单元测试时,系统属性没有设置,和文件位置没有解决。
应用程序使用Spring,想简单地将Spring配置为设置的系统属性。

更多信息:
要求仅用于配置。无法将新的Java代码或条目引入到IDE中。理想情况下,Spring的属性配置实现之一可以处理这一点 - 我只是无法找到正确的组合。

这种想法是接近,但需要添加Java代码:
Spring SystemPropertyInitializingBean

任何帮助在那里?任何想法都表示赞赏。

+0

相关问题与另外的答案:http://stackoverflow.com/questions/11306951/how-to-set-environment-variable-or-system-property -in-spring-tests/41305482 – anre 2016-12-23 17:51:35

回答

54

可以达到与两MethodInvokingFactoryBeans

组合创建访问System.getProperties和调用的putAll由内部bean获取的属性的外豆内部豆:

<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\ 
+0

谢谢。这工作。剩余问题:似乎log4j是在这些新系统属性初始化之前加载的另一个bean中初始化的。现在我开始弄清楚如何强制一个命令来初始化bean。 – Steve 2010-07-27 18:52:15

+1

使用Spring的依赖属性。非常感谢这个答案......它是纯金...... – HDave 2010-11-20 05:32:52

+7

Spring 3通过消除对第二个MethodInvokingFactoryBean的需求来简化此操作。您使用SpEL并且目标对象行变为 Patrick 2011-01-11 00:00:10

88

有在如何做到这一点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> 
+0

不错,谢谢 – 2011-09-12 19:30:10

+1

非常好。谢谢。 – toolkit 2011-09-14 20:24:25

+0

+1优秀。当我想到需要编写多少代码才能做到这一点。有时候春天很神奇。 :-) – 2011-11-09 19:57:39

10

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" 

记得添加“取决于上”属性来强制将首先设置的系统属性。

+0

我无法得到这个工作到最后。 'SystemPropertyInitializer'使用'afterPropertiesSet()',在调用''之后显然不会被调用。 – Stewart 2017-03-21 03:17:04

3

对于一个更简洁的方法试试:

<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'}}"/>