mvc log java spring junit log4j

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.