How do I call a Grails service from a gsp?

xain picture xain · Mar 24, 2010 · Viewed 30.1k times · Source

How can I invoke a service directly from a view? I'm trying with ${my.domain.service.method}, but it complains it can't find the property.

And no, I don't want to use a controller because the view is a template.

Answer

carnator picture carnator · Aug 10, 2011

Best to use the tag library because creating a service instance directly in the view via the class loader WILL NOT autowire other services declared that may live in the service you are trying to use.

Using the tag library you will have auto-wiring of those services.

In your gsp view <g:customTag param1="$modelObjec" param2="someString" />

In your taglib folder (yourApp/grails-app/taglib/com/something/MyAppTagLib):

package com.something

class MyAppTagLib {

    def myService  // This will be auto-wired

    def customTag = { attribs ->
        def modelObj = attribs['param1']
        def someString = attribs['param2']

        // Do something with the params

        myService.method()

        out << "I just used method of MyService class"
    }
}

Your MyService:

package com.something

class MyService {

def anotherService // This will be auto-wired

def method() {
    anotherService.anotherMethod()
}

}