2009-12-03 8 views
12

Ho un requisito per avere tutti i nostri file di proprietà da memorizzare in una directory. La posizione di questa directory deve essere archiviata in una variabile di ambiente di sistema. Nel contesto dell'applicazione dovrò accedere a questa variabile di ambiente per creare il bean FileSystemResource. Ecco un esempio di quello che normalmente si sarebbero:Posso utilizzare una posizione basata su variabile di ambiente per Spring FileSystemResource?

<bean id="properties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
     <bean class="org.springframework.core.io.FileSystemResource"> 
      <constructor-arg> 
       <value>myprops.properties</value> 
      </constructor-arg> 
     </bean> 
    </property> 
</bean> 

Invece ho bisogno di farlo essere qualcosa di simile a

<value>${prop_file_location}/myprops.properties</value> 

Dove posizione del file prop è una variabile di ambiente. Qualcuno sa un modo semplice per farlo?

Sto usando la primavera 2.5.6 e Java 1.6

+0

Credo potuto utilizzare la System.getenv (String envname) per restituire il valore. Ma non sono sicuro di poter chiamare quel metodo nel contesto dell'applicazione? – predhme

+2

['@ PropertySources' nella primavera 4] (http://www.jayway.com/2014/02/16/spring-propertysource/) fornisce un modo di configurazione basato su Java per fare ciò:' @Configuration @PropertySources ({ @PropertySource ("default.properties"), @PropertySource (value = "file: $ {} CONF_DIR /optional-override.properties", ignoreResourceNotFound = true) } public class ApplicationConfig {} ' – chrisjleu

risposta

14

UPDATE

Abbiamo successivamente aggiornato a primavera 3.0.xe siamo stati in grado di sfruttare il linguaggio delle espressioni di primavera. Il nostro approccio semplificato da tre fagioli per il seguente frammento:

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
    <list> 
     <value>classpath:defaults.properties</value> 
     <value>file:/a/defined/location/project.properties</value> 
     <value>file:${AN_ENV_CONFIGURED_DIR}/project.properties</value> 
    </list> 
    </property> 

    <property name="ignoreResourceNotFound" value="true" /> 
    <property name="searchSystemEnvironment" value="true" /> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 
</bean> 

Questo ha permesso di avere sia uno sviluppo (i primi valori di default) posizione staticamente noto, o un percorso distribuito configurato tramite variabili env. Il configuratore li elabora in ordine (ad esempio il distribuito ha la precedenza sui valori predefiniti).

VECCHIO

ho finito per andare con un approccio non programmatica. Ho usato un MethodInvoker per recuperare il valore dell'ambiente. Sono stato in grado di passare poi a FileSystemResource.

<bean id="configPath" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" > 
    <property name="targetClass" value="java.lang.String" /> 
    <property name="staticMethod" value="java.lang.System.getenv" /> 
    <property name="arguments"> 
     <list> 
      <value>NAME_OF_VARIABLE</value> 
     </list> 
    </property> 
</bean> 
+0

qual è $ {AN_ENV_CONFIGURED_DIR}? –

+0

Spring EL. solo una variabile di proprietà o ambiente (supponendo che properiesplaceholderconfigurer sia impostato su search envir variabili on – predhme

+0

ho provato la soluzione e non funziona, ho creato una nuova variabile di ambiente che contiene il percorso del file di proprietà specifico. ho due domande 1. puoi per favore inserire il valore della variabile d'ambiente e come l'hai definita nelle variabili d'ambiente? la seconda domanda è che il valore della variabile d'ambiente viene rimpiazzato durante il runtime o il tempo di compilazione? e come sapere che il valore è stato sostituito correttamente? –

1

Si può sempre estendere il FileSystemResource (vale a dire PropertiesFileResource) che si sarebbe inizializzare prendendo anteponendo la proprietà di sistema posizione del file di proprietà per il percorso del file.

+0

I ho pensato di fare questo, ma avevo tre progetti separati con cui avevo bisogno di fare la stessa cosa. Immaginato un frammento di xml era meglio che implementare la stessa classe 3 volte – predhme

1

In Spring.Net abbiamo ottenuto l'interfaccia IVariableSource e PropertyPlaceholderConfigurer che sono in grado di recuperare i valori da variabili d'ambiente. Forse c'è qualcosa di simile in Spring Framework per Java?

Edit: Io penso ho trovato il corrispondente bean Java che prende il nome PropertyPlaceholderConfigurer pure in the java docs.

4

mentre rilevo che la questione necessaria 2.5.x, vale la pena sottolineare che il sostegno EL di Spring 3 (disponibile dal Nov 2009) avrebbe reso breve lavoro di questo genere di cose

@Value("#{ systemProperties['user.home'] }") 
private String userHome ; 

o

<property name = "userHome" value ="#{ systemProperties['user.home'] }"/> 
+0

Sì, abbiamo finito con l'aggiornamento a Spring 3.0.X. Ho aggiornato la mia soluzione finale con l'approccio che abbiamo adottato. – predhme

0

Esempio:

Inizia si app con -DDA_HOME = c: \ temp

c: \ temp deve contenere la directory denominata "config"

In c: \ temp \ config hai l'app file.proprietà (per esempio)

estensione caricatore Spring:

public class Loader extends org.springframework.beans.factory.config.PropertyPlaceholderConfigurer{ 

    private String appHome; 

    public void setAppHome(String appHome) { 
     this.appHome = appHome; 
    } 

    @Override 
    public void setLocation(Resource location) { 
     if(appHome==null){ 
      throw new RuntimeException("You must specify VM property DA_HOME, this directory must contain " + 
        "another directory, called config, inside the config directory app.properties " + 
        "file must be found with the configuration properties"); 
     } 
     String configurationDirectory = appHome + System.getProperty("file.separator") + "config"; 
     String fileName = location.getFilename(); 
     Resource file = new FileSystemResource(configurationDirectory + System.getProperty("file.separator")+ fileName); 
     super.setLocation(file); 
    } 
} 

specificare il nuovo caricatore e la sua configurazione base:

<bean id="placeholderConfig" class="your.Loader"> 
     <property name="appHome" value="#{systemProperties['DA_HOME']}"/> 
     <property name="location" value="app.properties" /> 
    </bean> 
Problemi correlati