Esternalizzare file di properties in un app Java con Spring

di il
6 risposte

Esternalizzare file di properties in un app Java con Spring

Perdonate la domanda che per molti potrà sembrare banale: mettiamo il caso che io sviluppo la mia bella web app con Spring, la deployo e ottengo il jar. L'app però necessita di ricevere dei parametri configurabili dall'esterno (tipo parametri di connessione al DB, path di file ecc...). Come dovrei fare questo?

Credo che si possa fare tramite server (sto usando Tomcat), dove posso dirgli che in una data cartella ci sono dei file di configurazione. Ma poi come li uso questi file dalla mia applicazione, visto che il modo in cui li richiamavo finora era questo:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  		<property name="locations" value="classpath:database.properties"/>
	</bean>
, avendo messo quindi il file nel classpath ?

6 Risposte

  • Re: Esternalizzare file di properties in un app Java con Spring

    franbisc ha scritto:


    L'app però necessita di ricevere dei parametri configurabili dall'esterno (tipo parametri di connessione al DB, path di file ecc...). Come dovrei fare questo?
    Beh, dipende, ci sono molti modi. Puoi anche sfruttare librerie dedicate alla "configurazione" come ad esempio la OWNER o altro. Si può benissimo integrarle in Spring.

    franbisc ha scritto:


    il modo in cui li richiamavo finora era questo:
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
      		<property name="locations" value="classpath:database.properties"/>
    	</bean>
    , avendo messo quindi il file nel classpath ?
    Se usi almeno Spring 3.1, la documentazione consiglia di usare PropertySourcesPlaceholderConfigurer invece che PropertyPlaceholderConfigurer.
    Comunque se segui questa strada specifica di Spring, poi i valori delle key di configurazione li puoi "iniettare" nei bean con ${ ... } (ad esempio negli XML) oppure con @Value("${ ... }") nelle classi "bean" Spring.
  • Re: Esternalizzare file di properties in un app Java con Spring

    andbin ha scritto:


    Se segui questa strada specifica di Spring, poi i valori delle key di configurazione li puoi "iniettare" nei bean con ${ ... } (ad esempio negli XML) oppure con @Value("${ ... }") nelle classi "bean" Spring.
    Cosa intendi con "key di configurazione"? potresti fare un esempio for dummies?
  • Re: Esternalizzare file di properties in un app Java con Spring

    franbisc ha scritto:


    Cosa intendi con "key di configurazione"?
    chiave = valore
    ^^
    la key
  • Re: Esternalizzare file di properties in un app Java con Spring

    Ah ok, allora è quello che stavo già facendo.
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
      		<property name="locations" value="classpath:database.properties"/>
    	</bean>
    	
    	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    		<property name="url" value="${jdbc.url}" />
    		<property name="driverClassName" value="${jdbc.driverClassName}" />
    		<property name="username" value="${jdbc.username}" />
    		<property name="password" value="${jdbc.password}" />
    	</bean>
    Il problema in quello che ho scritto è che il file NON deve essere nel classpath, che credo significhi automaticamente nel jar, ma deve essere esterno. Cioè vorrei arrivare ad avere una cartella root, e poi root/applicazione.jar e root/database.properties
  • Re: Esternalizzare file di properties in un app Java con Spring

    franbisc ha scritto:


    Il problema in quello che ho scritto è che il file NON deve essere nel classpath, che credo significhi automaticamente nel jar
    "in classpath" non vuol dire per forza "solo in un jar". Il classpath è concettualmente un elenco di directory e/o file .jar. Poi è chiaro che se si tratta di una applicazione desktop/console è più facile avere il controllo sull'avvio e quindi mettere anche "altro" in classpath.
    Se invece si tratta di una web application, è decisamente meno facile avere il controllo del classpath.

    franbisc ha scritto:


    ma deve essere esterno. Cioè vorrei arrivare ad avere una cartella root, e poi root/applicazione.jar e root/database.properties
    file:///path/blabla/database.properties
  • Re: Esternalizzare file di properties in un app Java con Spring

    Potresti creare un file properties key/value e metterlo in una cartella del tomcat che poi vai a definire all'interno del file catalina.properties nella proprietà shared.loader (mi sembra si chiami così).

    Una volta messo il file la dentro, puoi caricarlo semplicemente tipo così
    
    public class PropertyUtil {
        private static Properties getPropertyUtil() throws IOException {
            try{
                InputStream is = PropertyUtil.class.getClassLoader().getResourceAsStream("nomedelfile.properties");
                Properties dbHelperProps = new Properties();
                dbHelperProps.load(is);
                return dbHelperProps;
            }
            catch (IOException e){
                throw new IOException("File dbhelper.properties non trovato nella classpath.");
            }
        }
    }
    
Devi accedere o registrarti per scrivere nel forum
6 risposte