2013-04-02 11 views
5

Mein Problem sieht einfach aus, aber ich kann es nicht lösen. Ich habe eine Eigenschaftendatei, die Konfigurationsdetails aller Umgebungen enthält (dev, qa, prod).Spring Property Platzhalter mit String Verkettung

Beispiel config.properties:

dev.maxLength=2000 
qa.maxLength=4000 

Wir haben eine Datei übergeordneten Eigenschaften, die den Hostnamen hält, Umwelt-Mappings.

Beispiel hosts.properties:

host1=dev 
host2=qa 

Der Eigenschaftsname host1 wird in einer Bean hostname gespeichert.

<bean id="hostname" 
    factory-bean="localhostInetAddress" 
    factory-method="getHostName"/> 

Um die Konfiguration zu beheben Eigenschaften nenne ich die Saiten zu verbinden haben wie folgt ${${**hostname**}.maxLength} die als ${dev.maxLength}

Ich versuchte Spel ohne Erfolg mit gelöst werden sollte. Ich bekomme Could not resolve placeholder Ausnahme. Wie kann ich einen Bean-Wert im Property-Platzhalter verketten? Wie werden dynamische Eigenschaftsnamen konstruiert?

Frühling Version 3.2

Antwort

2

ich das Problem gelöst, indem PropertyPlaceholderConfigurer Bohnen Properties ändern. <util:properties/> sind in SPEL zugänglich.

Beispiel: "#{prop[host+'.'+'maxLength']}"

wo host eine Bohne ist.

+0

Möchten Sie Ihre XML teilen? Ich möchte das Gleiche tun, war mir aber nicht sicher, was du erwähnt hast, indem du es in Eigenschaften änderst ... –

2

Es wäre besser, umgebungsspezifischen Eigenschaften in einer eigenen Datei zu haben und Federprofile verwenden. Zum Beispiel habe ich vier XML-Dateien nur für die Konfiguration der Datenbank, local.db.xml, dev.db.xml, qa.db.xml und prod.db.xml. Innerhalb jeder db.xml setze ich das Profil auf den entsprechenden Wert.

Mein local.db.xml hat

<beans profile="db.local" .. > 

Für Tomcat starten, ich die VM-Optionen wie folgt fest

-Dspring.profiles.active=db.local 
+0

Ich kann nicht Umgebungsvariablen/JVM-Eigenschaften verwenden, ist es eine Einschränkung Politik. – user2235506

12

Um die Werte, die aus Platzhaltern der Spring-Eigenschaft analysiert werden, zu verketten, müssen Sie ihre Werte mit einzelnen Quouten ('') umgehen und die Platzhalterausdrücke mit einem SpEL-Ausdruck unter Verwendung von #{} umbrechen.

<bean id="myService" class=""com.services.MyService"> 
    ... 
    <property name="endpointAddress" value="#{'${server}' + ':' + '${port}' + '${endpoint}'}" /> 
</bean> 

wo:

server = http://domain.host.com

port = 7777

Endpunkt =/services/myservice

Das Ergebnis wäre:

http://domain.host.com:7777/services/myservice

Verwandte Themen