问题
Simple question :
I have a service class (let's say helpersService
) and a method def constructURI(params)
.
How can I call this method from a template view.
I have tried the following code without success
<% def helpersService = new HelpersService() // or def helpersService
%>
<img src="${helpersService. constructURI(params)}"/>
But I get the following result:
No signature of method: com.HelpersService. constructURI() is applicable for argument types...
or (in case I use def helpersService
)
Cannot invoke method constructURI() on null object
Any ideas?
回答1:
Services are not intended to be used inside views. You could create a TagLib where you can get a reference to the service via dependency injection.
回答2:
An easier method, assuming your view is being rendered by a Controller, is to just pass a reference to the service from the action to the view within the model, i.e.:
class someController {
def someService
def someAction = {
render(view: 'someView', model: ['someService': someService])
}
}
It can then be used as you would expect within the view. For a template rendered by a view, obviously you need to pass the reference to the template as well. Just to be clear though, S. Puchbauer is right; services are not really supposed to be used within Views, and you may experience difficult to diagnose problems, especially related to transactions and the Hibernate session.
回答3:
I found out, that this groovy inline code works:
<% def xxxService = application.getAttribute("org.codehaus.groovy.grails.APPLICATION_CONTEXT").getBean("xxxService") %>
You can call functions of the service just like this:
<g:select optionKey="key" from="${xxxService.getWhateverList()}" name="tarif" value="${accountInstance?.tarif}" ></g:select>
回答4:
Well I have found a workaround with the following code :
def helpersService = grailsApplication.classLoader.loadClass('HelpersService').newInstance()
However it is better to use Service via dependency injection, so I will try out Siegfried advice.
回答5:
You can do this easily without creating a tag lib by using the set tag:
<g:set var="versionService" bean="versionService"/>
...
<p>version ${versionService.clientVersion}</p>
I found this solution here: http://mrhaki.blogspot.com/2013/08/grails-goodness-use-services-in-gsp.html
来源:https://stackoverflow.com/questions/1607186/how-to-call-a-grails-service-in-a-view