Using g.render in a grails service

后端 未结 4 381
感动是毒
感动是毒 2020-12-08 21:58

I\'m trying to use g.render in a grails service, but it appears that g is not provided to services by default. Is there a way to get the templating engine to render a view

相关标签:
4条回答
  • 2020-12-08 22:35

    My advice would be to do this in the controller. Service should have reusable logic and not depend on a view template, leave that work to the controller. Use the service to get the data you need to pass to the template, but leave the work of interacting with the template to the controller.

    0 讨论(0)
  • 2020-12-08 22:36

    I totally agree with John's argumentation - doing GSP in services is generally a bad design decision. But no rules without exceptions! If you still want to do this, try the following approach:

    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
        }
    }
    

    Using the gspTagLibraryLookup bean you can of course access every other desired taglib in a service.

    0 讨论(0)
  • 2020-12-08 22:45

    Here's a solution that's similar to Stefan's, but a bit simpler

    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
        }
    }
    
    0 讨论(0)
  • 2020-12-08 22:46

    It's even simpler now in Grails 2 with the PageRenderer. e.g.:

    class SomeService {
        def groovyPageRenderer
    
        void someMethod() {
            String html = groovyPageRenderer.render(view: '/email/someTemplateName')
        }
    }
    

    API - http://grails.org/doc/latest/api/grails/gsp/PageRenderer.html

    More complete example - http://mrhaki.blogspot.com/2012/03/grails-goodness-render-gsp-views-and.html

    0 讨论(0)
提交回复
热议问题