java - mvc - spring configuration log4j
Establecer propiedad del sistema con archivo de configuraciĆ³n de primavera (4)
Configuración :
Spring 2.5, Junit 4, Log4j
La ubicación del archivo log4j se especifica desde una propiedad del sistema
${log.location}
En tiempo de ejecución, la propiedad del sistema se establece con la opción -D java. Todo está bien.
Problema / Lo que necesito:
En el tiempo de prueba de la unidad, las propiedades del sistema no se configuran y la ubicación del archivo no se resuelve.
La aplicación utiliza Spring; simplemente desea configurar Spring para establecer la propiedad del sistema.
Más información:
El requisito es solo para la configuración. No se pueden introducir nuevos códigos Java o entradas en IDE. Idealmente, una de las implementaciones de configuración de propiedades de Spring podría manejar esto; simplemente no he podido encontrar la combinación correcta.
Esta idea está cerca, pero necesita agregar código Java:
Spring SystemPropertyInitializingBean
¿Alguna ayuda por ahí? Cualquier idea es apreciada.
Hubo una solicitud en los comentarios para un ejemplo de Spring 3 sobre cómo hacer esto.
<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>
Para un enfoque más directo, intente:
<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''}}"/>
Puede lograr eso con la combinación de dos MethodInvokingFactoryBeans
Cree un bean interno que acceda a System.getProperties y un bean externo que invoque a putAll en las propiedades adquiridas por el bean interno:
<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>
(Por supuesto, podría usar solo un bean y dirigirse a System.setProperties (), pero luego estaría reemplazando las propiedades existentes, lo que no es una buena idea.
De todos modos, aquí está mi pequeño método de prueba:
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"));
}
Y aquí está la salida:
my.key: myvalue
my.key2: myvalue2
my.key3: myvalue3
java.io.tmpdir: C:/DOKUME~1/SEANFL~1/LOKALE~1/Temp/
Spring Batch tiene una clase SystemPropertyInitializer que se puede usar para establecer una propiedad del sistema de forma un poco más concisa, por ejemplo, para forzar el registro de JBoss para usar slf4j (con 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"
Recuerde agregar el atributo "depende de" para forzar que la propiedad del sistema se establezca primero.