2013-07-05 6 views
7

Ich verwendete zuvor die jetzt veraltete Klasse org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer zum Laden einer Eigenschaftendatei aus dem Dateisystem des Servers. Ich hatte die folgende Bohne definiertem:Tomcat Context-Params ignoriert in Spring webapp bei Verwendung von PropertyPlaceholder

<bean class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer"> 
    <property name="locations" value="${config}"/> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/> 
    <property name="ignoreUnresolvablePlaceholders" value="true"/> 
    <property name="searchContextAttributes" value="true"/> 
    <property name="contextOverride" value="false"/> 
    <property name="ignoreResourceNotFound" value="true"/> 
    <property name="searchSystemEnvironment" value="false"/> 
</bean> 

Die config ist ein Argument, das übergeben wird, wenn Tomcat starten, dh

-Dconfig=/path/to/application.properties 

Für die Webapp ich auch eine Kontext-Datei haben:

<Context docBase="/path/to/application.war"> 
    <Parameter name="host" value="localhost" override="false"/> 
    <Parameter name="port" value="8080" override="false"/> 
</Context> 

Wenn die Datei .properties, die durch das Argument -Dconfig angegeben wird, die Eigenschaft enthält, auf die eine andere Bean verweist, wird der Wert auszurückgegebenDatei wird verwendet, andernfalls wird der Wert aus der XML-Kontextdatei verwendet.

Dies ermöglichte mir, eine Reihe von Standardeigenschaften mit der WAR bereitgestellt und wenn nötig, konnte ich eine .properties Datei angeben, um bestimmte Werte zu überschreiben.

Jetzt aktualisiere ich, um die neuen Eigenschaften Abstraktionen in Frühling 3.1 zu verwenden, aber ich kann nicht scheinen, herauszufinden, was der äquivalente Ansatz dazu ist?

Ich habe die gleiche Kontext-Datei und in der gleichen Art und Weise eingesetzt Krieg, und ich habe nun folgend in der Anwendung:

<context:property-placeholder 
     location="${config}" 
     system-properties-mode="OVERRIDE" 
     ignore-resource-not-found="true" 
     ignore-unresolvable="true"/> 

Dies findet und nutzt die Eigenschaften von der Eigenschaften-Datei, aber es funktioniert nicht Verwenden Sie die Werte aus der Kontext-XML-Datei.

Wie bekomme ich meine Anwendung, die Kontextparameter zu verwenden, wenn Sie diesen neuen Eigenschaft-Platzhalter verwenden?

Danke.

Antwort

4

Um das Problem zusammenzufassen, wurden die Kontextparameter aus der Servlet-Kontextdatei nicht zum Auflösen von Platzhaltern verwendet, wenn der neue Namespace des Eigenschaftsplatzhalters in Spring 3.1 verwendet wurde.

Ich habe eine Lösung herausgefunden, mit dem folgenden

<context:property-placeholder location="${config}" local-override="true" ignore-resource-not-found="true"/> 

I eine oder mehr PROPERTIES-Dateien auf dem lokalen Dateisystem einer JVM arg mit angeben, zB:

-Dconfig=/path/app.properties 

Wenn Eine Platzhaltereigenschaft kann nicht aufgelöst werden, nachdem die Datei app.properties überprüft wurde. Anschließend werden die Servlet-Kontextparameter überprüft.

Das erlaubt mir, Standardwerte mit Kontextparametern in der web.xml zu haben, und wo ich diese Werte überschreiben kann, indem ich den Speicherort von * .properties-Dateien unter Verwendung der config JVM arg festlege.

Der Schlüssel, um es auf diese Weise zu arbeiten, war local-override="true", die standardmäßig falsch ist. Ich bin nicht ganz sicher, dass es Sinn macht, da die Beschreibung für dieses Attribut lautet:

Gibt an, ob lokale Eigenschaften Eigenschaften aus Dateien überschreiben. Standard ist "falsch": Eigenschaften aus Dateien überschreiben lokale Standardwerte.

Wenn der gleiche Eigenschaft Schlüssel existiert in den app.properties und die web.xml der Wert aus den app.properties verwendet wird.

1

Spring verwendet eine Standardeigenschaftsdatei, sofern die benutzerbasierte Eigenschaftendatei nicht definiert ist. Wenn Sie die Datei .properties steuern möchten, befolgen Sie die Anweisungen unter here.

Wenn Sie die application.properties nutzen möchten, gibt es zwei Möglichkeiten.

Mit dem util-Tag können Sie eine Property-Klasse zum Lesen der Eigenschaften in Ihrer Anwendung verwenden. Beispiel:

@Autowired 
public MyPropertyReader(Properties appProperties) { 
    String prop1 = appProperties.getProperty("my.address"); 
    String prop2 = appProperties.getProperty("my.version"); 
} 

Wenn Sie die Werte in Ihrer Kontextdatei verwenden möchten, verwenden Sie den Kontext: property-placeholder -Tag. 6161 in application.properties: Dann können Sie Ihre Werte als

<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory" p:brokerURL="${jms.primary.server}"/> 

wo zum Beispiel jms.primary.server = 172.168.10.18 verwenden.

+0

Ich glaube nicht, dass Sie meinen ursprünglichen Beitrag vollständig verstanden haben. Ich habe die Platzhalter bereits mithilfe der Eigenschaftendatei aufgelöst. Die Frage fragt nach der Verwendung von Kontextparametern. – C0deAttack

+0

Haben Sie den Link vom ersten Satz verfolgt? Der Rest der Antwort ist nur ein Add-on für andere Entwickler, die .properties und application.properties verwenden. – luksmir

+0

Das Problem betrifft Kontextparameter - keine Eigenschaftendateien. – C0deAttack

Verwandte Themen