Как позвонить в сервис Grails в представлении? - PullRequest
6 голосов
/ 22 октября 2009

Простой вопрос: У меня есть класс обслуживания (скажем, helpersService) и метод def constructURI(params). Как я могу вызвать этот метод из представления шаблона.

Я попробовал следующий код без успеха

<% def helpersService  = new HelpersService() // or def helpersService
%>
<img src="${helpersService. constructURI(params)}"/>

Но я получаю следующий результат:

No signature of method: com.HelpersService. constructURI() is applicable for argument types...

или (в случае использования def helpersService)

Cannot invoke method constructURI() on null object 

Есть идеи?

Ответы [ 5 ]

19 голосов
/ 22 октября 2009

Сервисы не предназначены для использования внутри представлений. Вы можете создать TagLib, где вы можете получить ссылку на сервис через внедрение зависимостей.

7 голосов
/ 31 октября 2009

Более простой метод, если предположить, что ваш вид отображается контроллером, - просто передать ссылку на сервис из действия в представление в модели, т.е.

class someController {
  def someService
  def someAction = {
    render(view: 'someView', model: ['someService': someService])
  }
}

Затем его можно использовать так, как вы ожидаете в представлении. Для шаблона, представленного представлением, очевидно, что вам также необходимо передать ссылку на шаблон. Просто чтобы прояснить это, С. Пухбауэр прав; сервисы не должны использоваться в Views, и у вас могут возникнуть проблемы с диагностикой, особенно связанные с транзакциями и сеансом Hibernate.

2 голосов
/ 19 декабря 2009

Я обнаружил, что этот отличный встроенный код работает:

<% def xxxService = application.getAttribute("org.codehaus.groovy.grails.APPLICATION_CONTEXT").getBean("xxxService") %>

Вы можете вызвать функции сервиса так:

<g:select optionKey="key" from="${xxxService.getWhateverList()}" name="tarif" value="${accountInstance?.tarif}" ></g:select>
1 голос
/ 01 сентября 2015

Вы можете сделать это легко, не создавая тег lib, используя set tag:

<g:set var="versionService" bean="versionService"/>
...
<p>version ${versionService.clientVersion}</p>

Я нашел это решение здесь: http://mrhaki.blogspot.com/2013/08/grails-goodness-use-services-in-gsp.html

1 голос
/ 22 октября 2009

Ну, я нашел обходной путь со следующим кодом:

def helpersService = grailsApplication.classLoader.loadClass('HelpersService').newInstance()

Однако лучше использовать Service через внедрение зависимостей, поэтому я опробую совет Зигфрида.

...