Como chamar um serviço Grails em um ponto de vista?
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?
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