2009-12-03 12 views
12

Ich habe eine Anforderung, alle unsere Eigenschaftendateien in einem Verzeichnis gespeichert zu haben. Der Speicherort dieses Verzeichnisses sollte in einer Systemumgebungsvariablen gespeichert werden. In meinem Anwendungskontext muss ich auf diese Umgebungsvariable zugreifen, um das FileSystemResource-Bean zu erstellen. Hier ist ein Beispiel dafür, was ich normalerweise haben:Kann ich einen Umgebungsvariablen-basierten Speicherort für Spring FileSystemResource verwenden?

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

Stattdessen werde ich brauchen, um es so etwas wie

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

sein Wo prop Dateipfad eine Umgebungsvariable ist. Kennt jemand einen einfachen Weg, dies zu tun?

Ich bin mit Feder 2.5.6 und Java 1.6

+0

ich Ich denke, das System.getenv (String envname) nutzen könnten, um gib den Wert zurück. Aber ich bin mir nicht sicher, ob Sie diese Methode im Anwendungskontext aufrufen können? – predhme

+2

['@ PropertySources' in Spring 4] (http://www.jayway.com/2014/02/16/spring-propertysource/) gibt Ihnen eine Java-basierte Konfigurationsmethode, um dies zu tun:' @Configuration @PropertySources ({ @PropertySource ("default.properties"), @PropertySource (value = "file: $ {} CONF_DIR /optional-override.properties", ignoreResourceNotFound = true) } public class ApplicationConfig { } ' – chrisjleu

Antwort

14

UPDATE

Wir Spring 3.0.X später aufgerüstet, und wir konnten die Vorteile der Federausdruckssprache nehmen. Unser Ansatz von drei Bohnen auf den folgenden Ausschnitt vereinfacht:

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

Dies erlaubte uns, entweder eine Entwicklung (die ersten Ausfälle) statisch bekannten Standort oder eine entfaltete Position konfiguriert über env Variablen zu haben. Der Konfigurator verarbeitet diese in der richtigen Reihenfolge (d. H. Das Deployed hat Vorrang vor den Standardwerten).

OLD

Ich landete mit einem nicht programmatischen Ansatz gehe. Ich habe einen MethodInvoker verwendet, um den Umgebungswert abzurufen. Ich konnte das dann in die FileSystemResource übergeben.

<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

was ist das $ {AN_ENV_CONFIGURED_DIR}? –

+0

Frühling EL. nur eine Eigenschaft oder eine Umgebungsvariable (vorausgesetzt, Ihr properiesplaceholderconfigurer ist auf "envir" festgelegt onment-Variablen. – predhme

+0

Ich habe versucht, Ihre Lösung und es funktioniert nicht, ich habe eine neue Umgebungsvariable, die den Pfad der spezifischen Eigenschaft Datei enthält. Ich habe zwei Fragen 1. Kannst du bitte den Wert der Umgebungsvariablen und wie du ihn in Umgebungsvariablen definiert hast? Die zweite Frage ist, dass der Wert der Umgebungsvariablen während der Laufzeit oder der kompilierten Zeit ersetzt wird. und wie kann man wissen, dass der Wert korrekt ersetzt wird? –

1

Man konnte immer die FileSystemResource erweitern (das heißt PropertiesFileResource), die sich, indem das Voranstellen der Eigenschaft Speicherort Systemeigenschaft auf den Dateipfad initialisieren würde.

+0

I dachte darüber nach, aber ich hatte drei separate Projekte, mit denen ich das gleiche tun musste.Ein Snippet von xml war besser als das Implementieren der gleichen Klasse 3 mal. – predhme

1

In Spring.Net wir die IVariableSource Schnittstelle und PropertyPlaceholderConfigurer bekommen haben die in der Lage sind Variablen abzurufen Werte von Umgebung. Vielleicht gibt es im Spring Framework für Java etwas Ähnliches?

Edit: I denken fand ich die Java Bean entsprechen, die PropertyPlaceholderConfigurer auch in the java docs gestattet.

4

während ich fest, dass die Frage erforderlich 2.5.x, es lohnt sich unter Hinweis darauf, dass der Frühling 3 des EL-Unterstützung (verfügbar seit November 2009) würden kurze Arbeit dieser Art der Sache

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

oder

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

Ja, wir haben das Upgrade auf Spring 3.0.X abgeschlossen. Ich habe meine endgültige Lösung mit dem von uns gewählten Ansatz aktualisiert. – predhme

0

Beispiel:

Starten Sie App mit -DDA_HOME = c: \ temp

c: \ temp muss das Verzeichnis "config" enthalten

In c: \ temp \ config gibt es eine Datei-App.Eigenschaften (zum Beispiel)

den Frühling loader Extend:

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

den neuen Loader und seine Konfiguration Basis angeben:

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