2014-04-17 21 views
21

Stiamo usando il boot a molla in un progetto multi-modulo.Spring boot application.properties progetti multi-modulo maven

Abbiamo un modulo di accesso al dominio che include le classi di oggetti dominio comuni, i repository, insieme alla configurazione per l'origine dati, JPA, Hibernate, ecc. Questi sono configurati utilizzando un'applicazione.properties. Abbiamo inserito tutta questa configurazione nel modulo comune per risparmiare la duplicazione di queste configurazioni comuni nei moduli di livello superiore.

Questo funziona correttamente quando si crea il modulo di dominio, quindi le configurazioni vengono caricate correttamente nelle unità di test.

Tuttavia i problemi iniziano quando proviamo ad usare il modulo di dominio nei moduli di livello superiore; hanno le loro proprie proprietà application.properties, il che significa che Spring li carica e non il modulo Domain application.properties, il che significa che l'origine dati non è configurata perché sono caricati solo i moduli superiori application.properties.

Quello che vorremmo è sia il modulo dominio che le proprietà dell'applicazione di livello superiore da caricare da Spring. Ma non possiamo vedere un modo semplice per farlo.

Sto pensando che questo deve essere un problema comune e mi chiedo se esistono soluzioni consigliate per questo problema?

Poiché stiamo utilizzando il boot di primavera, la soluzione dovrebbe idealmente utilizzare le annotazioni anziché applictionContext.xml.

risposta

3

Forse dovresti usare solo application.properties nel progetto di aggregatore di primo livello?

È sempre possibile utilizzare @PropertySource nei progetti figlio per configurarli con un nome specifico per il loro caso d'uso.

Oppure è possibile utilizzare nomi diversi per ciascun progetto e incollarli insieme nel progetto di livello superiore utilizzando spring.config.location (separati da virgola).

+0

Se noi abbiamo le proprietà del file al progetto di aggregatore di livello superiore come possiamo scrivere dei test per i progetti figlio? Dovremmo avere di nuovo quelle proprietà nelle risorse di test dei progetti figli? – DBS

1

Un'altra cosa che si può fare (oltre a usare solo application.properties al livello principale come menziona Dave Syer) è denominare il file delle proprietà del modulo dominio come domainConfig.properties.

In questo modo si evita il nome scontro con application.properties.

domainConfig.properties conterrà tutti i dati necessari affinché il modulo di dominio possa essere testato su di esso. L'integrazione con il resto del codice può essere fatto facilmente sia usando multipla @PropertySource (uno per domainConfig.properties e uno per application.properties) o la configurazione di un PropertySourcesPlaceholderConfigurer fagiolo nel tuo Java Config (check out this tutorial) che si riferisce a tutti i file di proprietà necessari

+0

Questo è più o meno quello che ho detto, ma se lo rende più chiaro a tutti, va tutto bene. Non consiglierei di usare un altro 'PropertySourcesPlaceholderConfigurer' (duplica semplicemente lo sforzo di quello che è già lì), suppongo che sia un'opzione se non puoi cambiare le proprietà' spring.config. * 'In fase di runtime. –

+0

Ok, ho frainteso la tua risposta, pensavo che intendessi eliminare il file delle proprietà nel dominio e utilizzare solo il file delle proprietà al livello più alto. Mi dispiace per quello! – geoand

4

Sono d'accordo con @Dave Syer. L'idea di dividere un'applicazione in più moduli è che ognuno di questi è un'unità indipendente, in questo caso un file jar. In teoria è possibile suddividere ciascuno di questi file jar nei propri repository di origine e quindi utilizzarli in più progetti. Supponiamo che tu voglia riutilizzare queste classi di dominio in un'applicazione web e batch, se tutta la configurazione del livello APPLICATION è memorizzata all'interno di ciascuno dei singoli moduli, riduce gravemente la loro riusabilità.

IMO solo il modulo di aggregazione deve contenere tutta la configurazione necessaria per l'esecuzione come applicazione, tutto il resto è semplicemente una dipendenza che può essere remixata e riutilizzata secondo necessità.

+0

Sto cercando è una buona convenzione per l'impostazione dei valori di proprietà predefiniti nei moduli figlio. Quindi il modulo aggregatore deve interessarsi solo a se stessi modificando le proprietà del modulo figlio che devono modificare, non tutte le proprietà del modulo figlio. Se ci pensi, ecco come funziona Spring Boot; ha comunemente utilizzato i valori predefiniti per i suoi progetti JDBC, JPA, WEB e quindi è necessario solo modificare quelli che ti interessano. – user1232555

+0

Quindi, in tal caso, perché non utilizzare una configurazione automatica di avvio a molla? Se si impostano realmente le proprietà (URL di origine dati, ecc.), Non penso che sia necessariamente uguale a quello che sta facendo l'avvio a molla: stanno scegliendo le dipendenze appropriate e le impostazioni indipendenti dall'ambiente, impostando qualcosa come un'origine dati è da definizione dell'app specifica. Almeno a me, ogni jar deve contenere solo il codice e la configurazione specifica dell'applicazione deve essere inclusa nell'app aggregante. – Ben

1

Forse un altro approccio potrebbe essere quello di definire profili specifici per ciascun modulo e utilizzare il file application.properties solo per specificare che i profili di streghe sono attivi utilizzando la proprietà spring.profiles.include.

domain-module 
- application.properties 
- application-domain.properties 

app-module 
- application.properties 
- application-app.properties 

e nel file application.properties di app-modulo

spring.profiles.include=domain,app 
Problemi correlati