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?
Es aún más simple ahora en Grails 2 con el PageRenderer. p.ej:
class SomeService {
def groovyPageRenderer
void someMethod() {
String html = groovyPageRenderer.render(view: ''/email/someTemplateName'')
}
}
API: http://grails.org/doc/latest/api/grails/gsp/PageRenderer.html
Ejemplo más completo: http://mrhaki.blogspot.com/2012/03/grails-goodness-render-gsp-views-and.html
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.