60 votes

Réglez Le Système De La Propriété Avec Le Printemps, Le Fichier De Configuration

Configuration:
Spring 2.5, Junit 4, Log4j
Le log4j emplacement du fichier est spécifié à partir d'un système de propriété

${log.location}

Au moment de l'exécution, le système de jeu de propriétés à -D option java. Tout est bien.

Problème / Ce Dont J'Ai Besoin:
À l'unité de temps de test, le système de propriété n'est pas définie, et l'emplacement du fichier n'est pas résolu.
App utilise le Printemps, voudrais simplement configurer Printemps à l' ensemble du système de la propriété.

Plus D'Infos:
Exigence est que dans la configuration. Ne peuvent pas introduire de code Java, ou des entrées dans l'IDE. Idéalement, l'un des Printemps de la configuration des propriétés des implémentations pourrait gérer ce--je n'en ai pas été capable de trouver la bonne combinaison.

Cette idée est proche, mais a besoin d'ajouter du code Java:
Printemps SystemPropertyInitializingBean

Aucune aide là-bas? Toutes les idées sont les bienvenues.

96voto

Patrick Points 1664

Il y avait une demande dans les commentaires pour un Printemps 3 exemple sur la façon de le faire.

<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>

57voto

Sean Patrick Floyd Points 109428

Vous pouvez le faire avec la combinaison de deux MethodInvokingFactoryBeans

Créer un intérieur de haricot qui accède au Système.getProperties et d'une couche extérieure de haricot qui appelle putAll sur les propriétés acquises par l'intérieur 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>

(Vous pouvez bien sûr utiliser un seul haricot et du Système cible.setProperties(), mais alors vous seriez en remplacement de propriétés existantes qui n'est pas une bonne idée.

De toute façon, voici ma petite méthode de test:

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"));
}

Et voici le résultat:

my.key: myvalue
my.key2: myvalue2
my.key3: myvalue3
java.io.tmpdir: C:\DOKUME~1\SEANFL~1\LOKALE~1\Temp\

11voto

paulcm Points 804

Spring Batch a un SystemPropertyInitializer classe qui peut être utilisé pour définir un système de propriété légèrement de façon plus concise, par exemple, à force de JBoss journalisation à utiliser slf4j (avec 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"

N'oubliez pas d'ajouter le "dépend" de l'attribut à la force du système de propriété doit être définie en premier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X