Pergunta

Pergunta simples: Eu tenho uma classe de serviço (de vamos dizer helpersService) e um def constructURI(params) método. Como posso chamar esse método a partir de uma vista de modelo.

Eu tentei o seguinte código sem sucesso

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

Mas eu recebo o seguinte resultado:

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

ou (no caso eu uso def helpersService)

Cannot invoke method constructURI() on null object 

Todas as idéias?

Foi útil?

Solução

Serviços não se destinam a ser usado dentro de pontos de vista. Você poderia criar um TagLib onde você pode obter uma referência para o serviço através de injeção de dependência.

Outras dicas

Um método mais fácil, assumindo que a sua visão está sendo processado por um controlador, é só passar uma referência ao serviço da ação à vista dentro do modelo, ou seja:.

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

Pode então ser usado como seria de esperar dentro da visão. Para um template renderizado por uma visão, obviamente, você precisa passar a referência para o modelo também. Só para ficar claro que, S. Puchbauer é certo; serviços não são realmente deveria ser usado dentro de Views, e você pode experimentar difícil de diagnosticar problemas, especialmente relacionados a transações e a sessão Hibernate.

eu descobri, que este código Groovy em linha funciona:

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

Você pode chamar funções do serviço como este:

<g:select optionKey="key" from="${xxxService.getWhateverList()}" name="tarif" value="${accountInstance?.tarif}" ></g:select>

Bem, eu ter encontrado uma solução alternativa com o seguinte código:

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

No entanto, é melhor usar Serviço via injeção de dependência, por isso vou tentar conselhos Siegfried.

Você pode fazer isso facilmente, sem a criação de um lib tag usando a tag set:

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

Eu encontrei esta solução aqui: http: //mrhaki.blogspot.com/2013/08/grails-goodness-use-services-in-gsp.html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top