2010-01-13 17 views
35

Ho un'applicazione Groovy e voglio accedere programmaticamente a una proprietà definita in message.properties.groovy: Come accedere al file delle proprietà?

Come test ho provato la seguente:

println "capacity.created " + ${message.properties['capacity.created']} 

Ma non funziona (genera un'eccezione).

Ogni aiuto è benvenuto

Luis

risposta

8

ho trovato un modo per accedere alle proprietà del messaggio direttamente wothout ri-lettura di tutti i messaggi proprietà file (message_de.properties, message_fr.properties, etc.) È molto semplice.

message(code:"capacity.created") 

e funziona!

Luis

+0

Ho una classe separata che non è un controller, ho provato questo e non funziona ... qualche suggerimento? –

+0

@ CPU100 inject' messageSource' in quella classe e usa il ' metodo getMessage'. –

+0

Questo ha funzionato per me dove dovevo passare un valore dinamico per il titolo: Xplora

68

per leggere i file di proprietà in Groovy è possibile utilizzare la classe di utilità ConfigSlurper e accedere alle proprietà contenute utilizzando espressioni GPath. Tuttavia, è necessario essere consapevoli del fatto che ConfigSlurper non supporta i file di proprietà Java standard. Normalmente lo ConfigSlurper verrà utilizzato per leggere i file .groovy che potrebbero essere simili a un file di proprietà, ma aderire alla notazione standard groovy, quindi le stringhe sono all'interno di virgolette e commenti iniziano con // o sono all'interno di un blocco /* */. Quindi, per leggere un file di proprietà Java è necessario creare un oggetto java.util.Properties e l'uso che per creare un ConfigSlurper:

def props = new Properties() 
new File("message.properties").withInputStream { 
    stream -> props.load(stream) 
} 
// accessing the property from Properties object using Groovy's map notation 
println "capacity.created=" + props["capacity.created"] 

def config = new ConfigSlurper().parse(props) 
// accessing the property from ConfigSlurper object using GPath expression 
println "capacity.created=" + config.capacity.created 

Se si utilizza solo il file di proprietà all'interno di codice Groovy si dovrebbe utilizzare la variante di notazione Groovy direttamente.

def config = new ConfigSlurper().parse(new File("message.groovy").toURL()) 

Questo ti dà anche alcuni bei vantaggi rispetto file di proprietà standard, per esempio invece di

capacity.created="x" 
capacity.modified="y" 

è possibile scrivere

capacity { 
    created="x" 
    modified="y" 
} 
+0

Grazie per la risposta. Quello che hai fatto è valido per qualsiasi file di proprietà, ma il messaggio è un file i18n. Penso che funzionerà se le impostazioni locali del client sono impostate su un'altra lingua. Voglio dire, non stai leggendo message_de, message_es, message_fr, ecc. Inoltre, tutti i messaggi sono già letti dal sistema. Non vorrei leggerli di nuovo se posso evitarlo. – Luixv

+0

Ottima risposta. Grazie – Gervase

+4

Solo un avviso per il caricamento da classpath usa 'properties.load (getClass(). GetClassLoader(). GetResourceAsStream (" message.proprietà "))' – banterCZ

2

Non è una pratica migliore per leggere message.properties per i18n. È possibile utilizzare:

message(code:"capacity.created") 

nel controller come @Luixv suggerito o

messageSource.getMessage("capacity.created", 
         [].toArray(), "Capacity Created.", null) 

in qualsiasi altra primavera/Grails chicco dopo l'iniezione il fagiolo messageSource.

Problemi correlati