2013-05-10 20 views
6

Ho letto problemi simili su stacoverflow.com, ma nessuna delle soluzzioni mi ha aiutato. La seguente configurazione che uso (struttura del progetto Maven): il src/main/resources/properties/app.properties file diIl segnaposto della proprietà Spring non funziona

#possible values: dev test prod 
mode: dev 

Nella configurazione Primavera:

<context:property-placeholder location="classpath:properties/app.properties"/> 
<import resource="classpath:/spring/db/${mode}-datasource-config.xml"/> 

Sulla base del valore di ${mode} voglio importare il file di configurazione origine dati corrispondente.

Quando eseguo il tomcat7 incorporato utilizzando il comando mvn clean install tomcat7:run sto ottenendo l'errore:

10, 2013 5:52:29 PM org.apache.catalina.core.StandardContext loadOnStartup 
SEVERE: Servlet /SpringWebFlow threw load() exception 
java.lang.IllegalArgumentException: Could not resolve placeholder 'mode' in string value "classpath:/spring/db/${mode}-datasource-config.xml" 

Il file esiste target/classes/properties/app.properties.

Sto usando IntelliJ IDEA e nell'editor posso fare clic su "$ {mode}" in <import resource="classpath:/spring/db/${mode}-datasource-config.xml"/> e vedere il suo valore nel file delle proprietà. Anche l'editor stesso cambia ${mode} sul colore grigio dev mostrando che può riconoscere il valore della proprietà. Nell'editor vedo: <import resource="classpath:/spring/db/dev-datasource-config.xml"/>

Qualche idea per cui sto ricevendo l'errore e come può essere risolto?

+0

Quale versione Primavera si usa: <3.1 or > = 3.1? – Ralph

+0

@Ralph, 3.2.2.RELEASE Alexandr

risposta

12

I segnaposti delle proprietà nelle importazioni vengono risolti solo dalle variabili di ambiente o dalle proprietà di sistema.

Dalla versione 3.1 è possibile utilizzare uno ApplicationContextInitializer per aggiungere PropertySources allo Enviroment che risolverà il problema.

vedere http://blog.springsource.org/2011/02/15/spring-3-1-m1-unified-property-management/

Altra opzione per fare la stessa cosa è utilizzando i profili: http://blog.springsource.org/2011/02/14/spring-3-1-m1-introducing-profile/

Modifica

Ad esempio:

Aggiungere l'inizializzatore a web.xml

<context-param> 
    <param-name>contextInitializerClasses</param-name> 
    <param-value>foo.bar.AppContextInitializer</param-value> 
</context-param> 

E l'inizializzazione:

public class AppContextInitializer implements ApplicationContextInitializer<ConfigurableWebApplicationContext> { 

     @Override 
     public void initialize(ConfigurableWebApplicationContext applicationContext) { 
      Properties props; 
      try { 
       props = PropertiesLoaderUtils.loadAllProperties("/some/path"); 
       PropertiesPropertySource ps = new PropertiesPropertySource("profile", props); 
       applicationContext.getEnvironment().getPropertySources().addFirst(ps); 
      } catch (IOException e) { 
       // handle error 
      } 
     } 
    } 
+0

Non sono forte in primavera. Posso installare ApplicationContextInitializer in modo declativo nel file di configurazione di Spring? Non penso che sia necessario implementarlo solo per il caricamento di file di proprietà. Non riesco a trovare alcun esempio. Posso vedere solo le implementazioni java. – Alexandr

+0

No, non è possibile farlo in modo dichiarativo. 'PropertyPlaceHolderConfigurer' o' PropertySourcesPlaceholderConfigurer' sono 'BeanFactoryPostProcessors' quindi le importazioni vengono analizzate prima. –

+0

+1: per il collegamento http: //blog.springsource.org/2011/02/15/spring-3-1-m1-gestione proprietà unificate/ – Ralph

2

È questo formato di file proprietà valida? Penso che si dovrebbe usare seguenti contenuti per app.properties:

#possible values: dev test prod 
mode=dev 
Problemi correlati