ajax json grails render

ajax - Usando g.render en un servicio de griales



json grails (4)

Aquí hay una solución que es similar a la de Stefan''s , pero un poco más simple.

import org.codehaus.groovy.grails.plugins.web.taglib.ApplicationTagLib import org.springframework.context.ApplicationContext import org.springframework.context.ApplicationContextAware class MyService implements ApplicationContextAware { private ApplicationTagLib g void setApplicationContext(ApplicationContext applicationContext) { g = applicationContext.getBean(ApplicationTagLib) // now you have a reference to g that you can call render() on } }

Estoy intentando usar g.render en un servicio de Grails, pero parece que g no se proporciona a los servicios de forma predeterminada. ¿Hay alguna manera de obtener el motor de plantillas para representar una vista en el servicio? Puede que me esté yendo por el camino equivocado. Lo que busco es representar la vista de una plantilla parcial a una cadena y enviar la cadena resultante de vuelta como parte de una respuesta JSON para usar con las actualizaciones de AJAX.

¿Alguna idea?



Estoy totalmente de acuerdo con la argumentación de John: hacer GSP en servicios es generalmente una mala decisión de diseño. ¡Pero no hay reglas sin excepciones! Si aún desea hacer esto, pruebe el siguiente enfoque:

class MyService implements InitializingBean { boolean transactional = false def gspTagLibraryLookup // being automatically injected by spring def g public void afterPropertiesSet() { g = gspTagLibraryLookup.lookupNamespaceDispatcher("g") assert g } def serviceMethod() { // do anything with e.g. g.render } }

Usando el bean gspTagLibraryLookup puede, por supuesto, acceder a cualquier otra taglib deseada en un servicio.


Mi consejo sería hacer esto en el controlador. El servicio debe tener lógica reutilizable y no depender de una plantilla de vista, deje ese trabajo al controlador. Utilice el servicio para obtener los datos que necesita para pasar a la plantilla, pero deje el trabajo de interactuar con la plantilla al controlador.