Pregunta

Pregunta simple: Tengo una clase de servicio (digamos helpersService ) y un método def constructURI (params) . ¿Cómo puedo llamar a este método desde una vista de plantilla?

He intentado el siguiente código sin éxito

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

Pero obtengo el siguiente resultado:

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

o (en caso de que use def helpersService )

Cannot invoke method constructURI() on null object 

¿Alguna idea?

¿Fue útil?

Solución

Los servicios no están diseñados para ser utilizados dentro de las vistas. Puede crear un TagLib donde puede obtener una referencia al servicio a través de la inyección de dependencia.

Otros consejos

Un método más fácil, suponiendo que su vista está siendo representada por un Controlador, es simplemente pasar una referencia al servicio de la acción a la vista dentro del modelo, es decir,

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

Se puede usar como se esperaría dentro de la vista. Para una plantilla representada por una vista, obviamente también debe pasar la referencia a la plantilla. Sin embargo, para ser claros, S. Puchbauer tiene razón; no se supone que los servicios se usen en Views, y es posible que tenga problemas difíciles de diagnosticar, especialmente en relación con las transacciones y la sesión de Hibernate.

Descubrí que este maravilloso código en línea funciona:

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

Puede llamar a funciones del servicio de esta manera:

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

Bueno, he encontrado una solución con el siguiente código:

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

Sin embargo, es mejor usar el Servicio a través de la inyección de dependencia, así que probaré el consejo de Siegfried.

Puede hacer esto fácilmente sin crear una etiqueta lib utilizando la etiqueta set:

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

Encontré esta solución aquí: http: //mrhaki.blogspot.com/2013/08/grails-goodness-use-services-in-gsp.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top