Вопрос

Простой вопрос: У меня есть класс обслуживания (скажем, 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 

Есть идеи?

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top