7

Stiamo cercando un meccanismo di inclusione per gli script groovy per avere spazio per i problemi trasversali.Groovy fornisce un meccanismo di inclusione?

Nel mio esempio abbiamo, endpoint del servizio Web come script groovy e vogliamo accedere al nostro protocollo di servizio web. per questo usiamo il nostro oggetto implicito (ottenendo dal nostro framework) per creare la dichiarazione di registrazione.

Ma questo è codice boiler se lo codifichiamo in ogni endpoint del servizio Web.

Stiamo cercando qualcosa come include() in php, che include altri script groovy, ci sono idee su come farlo?

risposta

1

Dal momento che già citato “trasversali-preoccupazioni” Direi che è necessario intercettare il tuo webservice chiamate AOP stile (non un meccanismo di inclusione).

Grails è completamente integrato con Spring framework, quindi rappresenta una buona opzione per sfruttare le funzionalità Spring AOP. Dai un'occhiata a questo capitolo della guida ufficiale di Grails: http://grails.org/doc/latest/guide/14.%20Grails%20and%20Spring.html e cerca la parola AOP.

Forse c'è un purely groovy way di fare AOP, ma vorrei andare con grails e primavera.

1

Guardate la funzione di valutare (File):

Object evaluate(File file) 

http://groovy.codehaus.org/api/groovy/lang/Script.html

+1

Inutile se non si spiega come creare o ottenere un oggetto Script, perché quella classe è astratta. – Blaine

+0

Generalmente il codice che chiamerebbe questo è compilato su un'istanza di una sottoclasse anonima di 'Script'. –

10

Groovy tratta i suoi file come oggetti (pensateci come a capo automatico). E rende tutti i file .groovy all'interno del classpath java disponibili come classi. Quindi, se avete il file util.groovy, che contiene qualcosa di simile all'interno:

def static AuxMethod() { 
    return "Hello World" 
} 

chiamarlo da un altro file basta scrivere:

println util.AuxMethod() 

Questo è tutto. Di nuovo, assicurati che il tuo file util.groovy sia nel classpath.

+0

Sospetto che funzioni solo se i tuoi script groovy sono classi orientate agli oggetti. Con gli script funzionali regolari, probabilmente non funziona? – djangofan

+2

L'esempio funziona solo, almeno da Windows, se lo script util.groovy viene rinominato con capitalizzazione Util.groovy e il riferimento viene modificato in "println Util.AuxMethod()" – Blaine

+3

Seguito del mio commento precedente. Questo vale anche per UNIX. Non funziona finché non rinominare "util" in "Util". Inoltre, la maggior parte degli sviluppatori Java + Groovy scriverebbe la dichiarazione del metodo per conformarsi alle convenzioni Java: static def auxMethod. Cioè "statico" prima del nome del tipo e tutti i metodi iniziano con lettere minuscole (vedi ad esempio tonnellate di metodi statici in java.util.Collections). – Blaine

2

Per richiamare lo script u.groovy dallo script corrente, passando lungo gli argomenti originali alla u.groovy, eseguire

run(new File('u.groovy'), args) 

Ovviamente, si potrebbe anche inviare alcun argomento stringa che si desidera:

run(new File('u.groovy'), 
     ['one', new File('two.text').absolutePath] as String[]) 
1

Ho fatto qualche ricerca su questo argomento per un linguaggio specifico di dominio che stavo creando. Ci sono tre possibilità:

  1. Crea il tuo classi ereditare una classe Groovy genitore. Metti il ​​tuo codice condiviso nella classe base.

  2. Utilizzare ScriptBaseClass vedere http://groovy.codehaus.org/Embedding+Groovy. Questa è una classe sulla quale verranno creati tutti gli script.

  3. Utilizzare la funzionalità di metodi statici di importazione. Si noti che è possibile farlo all'interno del contenitore java (vedere http://mrhaki.blogspot.com/2011/06/groovy-goodness-add-imports.html).

Tutti questi funzionano benissimo. La mia preferenza è ScriptBaseClass. Questo funziona meglio se il codice comune è Groovy (il mosto ScriptBaseClass essere una classe Groovy. Non può essere una classe Java.)

Naturalmente, con tutti questi elementi, sarà ancora bisogno di chiamare in realtà il metodo comune nel tuo codice groovy. Ad esempio:

doCommonStuff(); 
. 
. do the rest of it here 
. 

Questo non è troppo orribile, non credo. Certamente lo stesso che aggiungere una sorta di affermazione di #include pre-processore.

Infine, tutto ciò presuppone che si abbia accesso al programma java che sta chiamando il proprio codice Groovy. In caso contrario, puoi comunque utilizzare le importazioni statiche. È solo una riga di codice in più.

import static com.mycompany.mycode.doCommonStuff 
doCommonStuf() 
. 
. do the rest of it here 
. 
Problemi correlati