2012-04-06 6 views
1

In einem Bereich unserer Frühlings-Konfiguration, die wir verwenden:Kann ich PropertyPlaceholderConfigurer verwenden, um die Eigenschaften von String zur Laufzeit zu ersetzen?

applicationContext.xml:

<bean class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" lazy-init="true"> 
    <property name="configLocation" value="classpath:ehcache.xml"/> 
</bean> 

jedoch ehcache.xml kein Standard-Feder Bean-Konfigurationsdatei ist aber enthält $ {ehcache.providerURL }, die wir ersetzen wollen auf das, was wir mit PropertyPlaceHolderConfigurer an anderer Stelle konfiguriert haben:

ehcache.xml:

<cacheManagerPeerProviderFactory 
    ... 
    providerURL=${ehcache.providerURL} 
    ... 
</cacheManagerPeerProviderFactory> 

Ich könnte die Maven/Profil/Filter-Kombination verwenden, aber das würde einen Build erstellen, der spezifisch für die Umgebung ist, für die er erstellt wird. Was ich wirklich tun möchte, ist die Vorverarbeitung der ehcache.xml zur Laufzeit, die Substitutionen basierend auf den von PropertyPlaceHolderConfigurer gelesenen Eigenschaften durchführt und dann das Ergebnis davon in die EhCacheManagerBean weiterleitet.

An diesem Punkt denke ich darüber nach, die Funktionalität hinter der @ Value-Annotation irgendwie zu duplizieren, da es "bla bla bla $ {property} bla bla bla" ersetzen kann, außer dass ich dies nach dem Lesen einer Datei von der Festplatte tun muss.

Irgendwelche Ideen, wie man das macht?

Danke. -AP_

Antwort

2

Nach einiger Suche, hier die Essenz das, was ich mit aufkommen. Ich verpackte dies in eine Factory, die eine Ressource akzeptiert und sie konvertiert, nachdem alle Zeilen durch $ {propertyPlaceHolder} mit den tatsächlichen Werten des Halters ersetzt wurden.

final ConfigurableListableBeanFactory 
     factory = 
      ((ConfigurableApplicationContext) applicationContext).getBeanFactory(); 

    String line = null; 
    while ((line = reader.readLine()) != null) { 
     try { 
      final String 
       result = factory.resolveEmbeddedValue(line); 
      writer.println(result); 
     } 
     catch (final Exception e) { 
      log.error("Exception received while processing: " + line, e); 
      throw e; 
     } 
    } 

Der Vorteil dieser Lösung ist, dass es die gleiche Ausstattung verwendet wie Spring verwendet @Value („$ {fooBar}“) Anmerkungen zu lösen. Das bedeutet, dass Sie SPEL und alles, was Spring normalerweise in der @Value-Annotation akzeptieren würde, verwenden können. Es ist auch in PropertyPlaceholderConfigurer integriert.

Ich hoffe, das hilft jemandem.

-AP_

1

PropertyPlaceholderConfigurer dient zum Ersetzen von Eigenschaften in Spring-Konfigurationsdateien. Es ersetzt Eigenschaften in externen Dateien nicht. Ihr Problem kann nicht mit PropertyPlaceholderConfigurer gelöst werden.

Sie org.springframework.cache.ehcache.EhCacheManagerFactoryBean.afterPropertiesSet() Methode außer Kraft setzen können und tun, was Sie mit xml tun wollen vor dem Erstellen CacheManager.You wissen, wie sauber es :)

sein kann
+0

Es gibt Code in Spring, der @Value ("bla $ {param} bla) verwendet und die Ersetzung ordnungsgemäß ausführt. Ich dachte daran, diesen Code zur Laufzeit irgendwie zu verwenden, um den Inhalt meiner Datei als String weiterzuleiten. und eine Zeichenfolge mit ersetzten Parametern zurückbekommen. –

+2

Nach einigem Graben habe ich folgendes gefunden: ((ConfigurableApplicationContext) applicationContext) .getBeanFactory(). ResolveEmbeddedValue ("$ {someValue}"); Ich kann jede alte Datei lesen, dann mit dieser Methode alle Platzhalter auflösen. Gibt es etwas in Spring, das mir erlauben wird, dies aus der Bean-Konfiguration zu tun, ohne mehr Code schreiben zu müssen? –

+0

Ich denke Adis Antwort ist ein ziemlich anständiger Hack. Lesen Sie das XML in eine Zeichenfolge, führen Sie eine String-Ersetzung für die gewünschten Teile durch, legen Sie die Zeichenfolge als Konfigurationsspeicherort fest (InputStreamResource/StringBufferInputStream), und rufen Sie dann super auf. – sourcedelica

6

Um Strings direkt zu manipulieren, können Sie die org.springframework.util.PropertyPlaceholderHelper

String template = "Key : ${key} value: ${value} " 
PropertyPlaceholderHelper h = new PropertyPlaceholderHelper("${","}"); 
Properties p = new Properties(); 
p.setProperty("key","mykey"); 
p.setProperty("value","myvalue"); 
String out = h.replacePlaceholders(template,p); 

und ersetzt den entsprechenden Eigenschaftswerte in einer Vorlage Werte verwenden könnten.

Verwandte Themen