Using g.render in a grails service Using g.render in a grails service json json

Using g.render in a grails service


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.


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


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.