Использование g.render в сервисе grails
Я пытаюсь использовать g.render в службе grails, но, похоже, g не предоставляется службам по умолчанию. Есть ли способ заставить механизм шаблонов визуализировать представление в сервисе? Возможно, я ошибаюсь. То, что я ищу, отображает представление из частичного шаблона в строку и отправляет результирующую строку обратно как часть ответа JSON для использования с обновлениями AJAX.
Любые мысли?
Ответы
Ответ 1
Я полностью согласен с аргументацией Джона - делать GSP в сервисах - это, как правило, плохое дизайнерское решение. Но никаких правил без исключений! Если вы все еще хотите сделать это, попробуйте выполнить следующий подход:
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
}
}
Используя gspTagLibraryLookup bean, вы можете, конечно, получить доступ ко всем другим желаемым taglib в службе.
Ответ 2
Это еще проще теперь в Grails 2 с помощью PageRenderer. например:.
class SomeService {
def groovyPageRenderer
void someMethod() {
String html = groovyPageRenderer.render(view: '/email/someTemplateName')
}
}
API - http://grails.org/doc/latest/api/grails/gsp/PageRenderer.html
Более полный пример - http://mrhaki.blogspot.com/2012/03/grails-goodness-render-gsp-views-and.html
Ответ 3
Мой совет должен был сделать это в контроллере. Служба должна иметь логику многократного использования и не зависеть от шаблона представления, оставьте эту работу контроллеру. Используйте службу, чтобы получить данные, необходимые для перехода к шаблону, но оставьте работу с шаблоном с контроллером.
Ответ 4
Здесь решение, подобное Stefan's, но немного проще
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
}
}
Ответ 5
Я знаю, что это старая тема, но любой, кто по-прежнему использует Grails 1.x, любит нас. Можно использовать https://grails.org/plugin/grails-template-engine?skipRedirect=true плагин