Pregunta

Tengo que llamar a la Recursos Plugin estático ( http://www.grails.org/ estática + Recursos + Plugin ) de mi clase de dominio.

Esto funciona perfectamente en un controlador:

 def tstLink = resourceLinkTo(dir:"docs/${identifier}",file:originalFileName)

pero en una clase de dominio consigo

Exception Message: No signature of method: static org.maflt.ibidem.Item.resourceLinkTo() is applicable for argument types: (java.util.LinkedHashMap) values: [[dir:docs/19e9ea9d-5fae-4a35-80a2-daedfbc7c2c2, file:2009-11-12_1552.png]] 

Asumo que esto es un problema general.

Entonces, ¿Cómo se llama un taglib como una función en una clase de dominio?

¿Fue útil?

Solución

Me encontré con este problema hace un tiempo para una aplicación que estaba trabajando. Lo que terminé haciendo fue poner una llamada a la etiqueta en un método de servicio:

class MyService {
   def grailsApplication //autowired by spring

   def methodThatUsesATag(identifier, originalFileName) {
      //This is the default grails tag library
      def g = grailsApplication.mainContext.getBean('org.codehaus.groovy.grails.plugins.web.taglib.ApplicationTagLib')

      g.resourceLinkTo(dir:"docs/${identifier}",file:originalFileName)
   }
}

A continuación, en mi clase de dominio, que podría llegar al servicio a través de la primavera autowiring así:

class MyDomain {
    String originalFileName
    def myService  //autowired

    static transients = ['myService'] //Necessary so that GORM doesn't try to persist the service instance.

    //You can create a method at this point that uses your
    //service to return what you need from the domain instance.
    def myMethod() {
       myService.methodThatUsesATag(id, originalFileName)
    }
}

Otros consejos

La mayoría de taglibs se basan en datos procedentes del controlador de lo que a menudo no es posible volver a utilizarlos mientras que otros la preocupación lógica de vista tan a menudo que no es algo que se quiere poner en una clase de dominio.

Dicho esto, estoy seguro de que haya razones así que tal vez la fuente de la taglib ayudará a:

class ResourceTagLib  {

    def externalResourceServerService

    def resourceLinkTo = { attrs ->
        out << externalResourceServerService.uri
        out << '/'
        if(attrs['dir']) {
            out << "${attrs['dir']}/"
        }
        if(attrs['file']) {
            out << "${attrs['file']}"
        }
    }
}

es decir, inyectar el externalResourceServerService en su dominio de clase y el resto deben ser simples.

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