Подтвердить что ты не робот

Использование g.render в сервисе grails

Я пытаюсь использовать g.render в службе grails, но, похоже, g не предоставляется службам по умолчанию. Есть ли способ заставить механизм шаблонов визуализировать представление в сервисе? Возможно, я ошибаюсь. То, что я ищу, отображает представление из частичного шаблона в строку и отправляет результирующую строку обратно как часть ответа JSON для использования с обновлениями AJAX.

Любые мысли?

4b9b3361

Ответ 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 в службе.

Ответ 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
    }
}