7

Estamos buscando un mecanismo de inclusión para que las secuencias de comandos groovy tengan espacio para preocupaciones transversales.¿Groovy proporciona un mecanismo de inclusión?

En mi ejemplo tenemos, los puntos finales del servicio web como guiones geniales y queremos iniciar sesión en nuestro protocolo de servicio web. para eso usamos nuestro objeto implícito (obteniendo de nuestro marco) para crear la declaración de registro.

Pero este es un código estándar si codificamos esto en cada punto final del servicio web.

Estamos buscando algo como include() en php, que incluye otras secuencias de comandos groovy, ¿hay alguna idea de cómo hacer esto?

Respuesta

1

Como ya mencionado “transversales-preocupaciones” yo diría que tiene que interceptar su servicio web llama AOP estilo (no es un mecanismo de inclusión).

Grails está completamente integrado con Spring framework, por lo que es una buena opción para explotar las funciones de Spring AOP. Eche un vistazo a este capítulo de la guía oficial de Grails: http://grails.org/doc/latest/guide/14.%20Grails%20and%20Spring.html y busque la palabra AOP.

Tal vez hay un purely groovy way de hacer AOP, pero me gustaría ir con grial y primavera.

1

observar la función de evaluar (Archivo):

Object evaluate(File file) 

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

+1

No es útil si no explica cómo crear u obtener un objeto Script, porque esa clase es abstracta. – Blaine

+0

Generalmente, el código que llamaría esto se compila en una instancia de una subclase anónima 'Script'. –

10

Groovy trata sus archivos como objetos (consúltelo como envoltura automática). Y hace que todos los archivos .groovy dentro del classpath java estén disponibles como clases. Así que si usted tiene la util.groovy archivo, que contiene algo como esto en el interior:

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

llamarlo de otro archivo que acaba de escribir:

println util.AuxMethod() 

Eso es todo. De nuevo, solo asegúrese de que su archivo util.groovy esté en la ruta de clase.

+0

Sospecho que solo funciona si tus guiones geniales son clases orientadas a objetos. Con scripts funcionales regulares, probablemente no funcione? – djangofan

+2

El ejemplo solo funciona, al menos desde Windows, si el script util.groovy se renombra con mayúsculas Util.groovy, y la referencia correspondiente cambia a 'println Util.AuxMethod()' – Blaine

+3

Seguimiento de mi comentario anterior. Esto se aplica a UNIX también. No funciona hasta que cambie el nombre de "util" a "Util". Además, la mayoría de la experiencia de los desarrolladores de Java + Groovy escribiría la declaración del método para cumplir con las convenciones de Java: static def auxMethod. Es decir. "estático" antes del nombre del tipo y todos los métodos comienzan con minúsculas (consulte, por ejemplo, toneladas de métodos estáticos en java.util.Collections). – Blaine

2

Para invocar la escritura u.groovy del script actual, que pasa a lo largo de los argumentos originales a la u.groovy, ejecute

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

Obviamente, también se puede enviar ningún argumento cadena que desea a:

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

Hice algunas investigaciones sobre esto para un lenguaje específico de dominio que estaba creando. Hay tres posibilidades:

  1. Cree sus clases como heredando una clase groovy para padres. Pon tu código compartido en la clase base.

  2. Utilice la clase ScriptBaseClass, vea http://groovy.codehaus.org/Embedding+Groovy. Esta es una clase sobre la cual se crearán todos sus scripts.

  3. Utilice la función Importar métodos estáticos. Tenga en cuenta que puede hacer esto dentro del contenedor java (consulte http://mrhaki.blogspot.com/2011/06/groovy-goodness-add-imports.html).

Todos estos funcionan genial. Mi preferencia es ScriptBaseClass. Esto funciona mejor si el código común es maravilloso (el mosto ScriptBaseClass ser una clase maravilloso. No puede ser una clase de Java.)

Por supuesto, con todos estos elementos, que todavía tendrá que llamar en realidad el método común en su código groovy. Por ejemplo:

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

Eso no es demasiado horrible, no creo. Ciertamente, casi lo mismo que agregar algún tipo de declaración de precomprador #include.

Y, por último, todo esto supone que tienes acceso al programa Java que está llamando a tu código de Groovy. Si ese no es el caso, aún puede usar las importaciones estáticas. Es solo una línea adicional de código.

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