2010-01-29 10 views
9

Ich muss das statische Ressourcen-Plugin (http://www.grails.org/Static+Resources+Plugin) aus meiner Domänenklasse aufrufen.So rufen Sie ein Taglib als Funktion in einer Domänenklasse

Das funktioniert perfekt in einem Controller:

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

aber in einer Domäne Klasse I

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

bekomme ich nehme an, das ein generelles Problem ist.

Also wie nennt man eine Taglib als Funktion in einer Domain-Klasse?

+0

ich gerade:

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) } } 

Dann in meiner Domain-Klasse, ich auf den Dienst über Feder autowiring auch bekommen könnte stieß auf genau das gleiche Problem und wollte diese Frage selbst stellen, bevor sie Ihre fand. –

+1

Die angenommene Antwort ist gut für allgemeine Taglib-Aufrufe, aber für den speziellen Anwendungsfall des Generierens von Links können Sie die 'grailsLinkGenerator'-Bean in Ihrem Service nur durch' def grailsLinkGenerator' in Ihrer Serviceklasse erhalten. Dann können Sie die Methode 'link' aufrufen und Parameter übergeben oder auf die Eigenschaft' serverBaseURL' zugreifen. –

+0

@TedNaleid diese Option war zu dem Zeitpunkt, als ich meine Antwort schrieb, nicht verfügbar. Das wäre der sauberere Ansatz. –

Antwort

11

Ich habe dieses Problem vor einiger Zeit bei einer App, an der ich gerade arbeitete, festgestellt. Was ich am Ende tun wurde in einer Service-Methode einen Aufruf an den Tag setzen:

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) 
    } 
} 
+0

Sie können diese Abhängigkeitsinjektion direkt in Domänenobjekte verwenden - Sie müssen keinen Dienst verwenden, um die Arbeit für Sie auszuführen. –

+0

Das mag jetzt stimmen. Es war nicht, als ich diese Frage ursprünglich beantwortete. –

+1

Ich habe seit dem auch entdeckt, dass Sie getDomainClass(). GetGrailsApplication() von einem Domain-Objekt (oder domainClass.grailsAppliction) aufrufen können, um die GrailsApplication zu bekommen. Es sieht so aus, als wäre dies mit Grails 2.0 verfügbar –

-1

Die meisten Taglibs basieren auf Daten vom Controller, so dass es oft nicht möglich ist, sie wiederzuverwenden, während andere die Ansichtslogik so oft betreffen, dass Sie sie nicht in eine Domain-Klasse einfügen möchten.

Das heißt, ich bin sicher, dass Sie Ihre Gründe so vielleicht die Quelle der taglib helfen haben:

class ResourceTagLib { 

    def externalResourceServerService 

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

dh injizieren, um die externalResourceServerService in Ihren Domain-Klasse und der Rest sollte einfach sein.

+0

Danke. Ich hätte das auch erwartet. Ich habe def tstLink = externalResourceServerService.resourceLinkTo (dir: "docs/$ {Bezeichner}", file: original) bekam aber Keine Signatur der Methode: ExternalResourceServerService.resourceLinkTo() für Argumenttypen anwendbar ist: (java .util.LinkedHashMap) Werte: [[Verzeichnis: docs/279a5b71-b05f-4d62-be7b-72a805b005e0, Datei: me.jpeg]] –

+0

So scheint es, als müsste ich nur die Datentypen korrigieren. Dies funktioniert nicht def tstLink2 = externalResourceServerService.resourceLinkTo ("docs/$ {identifier}". ToString(), originalFileName) mit oder ohne toString(). –

Verwandte Themen