2010-01-29 18 views
9

我需要從我的域類調用Static Resources Plugin(http://www.grails.org/Static+Resources+Plugin)。如何將Taglib作爲域類中的函數調用

這工作完全在一個控制器:

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

但在一個領域類,我得到

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

我想這是一個普遍的問題。

那麼,如何將一個taglib作爲一個函數在域類中調用呢?

+0

我只是遇到同樣的問題,並在找到你之前自己提出這個問題。 – 2010-01-29 03:25:16

+1

接受的答案適用於一般的taglib調用,但對於生成鏈接的具體用例,您可以通過服務類中的「def grailsLinkGenerator」來獲取服務中的'grailsLinkGenerator' bean。然後你可以調用'link'方法並傳遞參數,或者訪問'serverBaseURL'屬性。 – 2012-08-13 20:56:36

+0

@TedNaleid該選項在我寫答案的時候可能不可用。這將是更清潔的方法。 – 2013-07-18 13:43:09

回答

11

前段時間我遇到這個問題,我正在開發一個應用程序。我最終什麼事做是把一個調用標籤在服務方法:

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

然後在我的領域類,我能得到通過彈簧自動裝配服務,以及:

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

您可以直接在域對象中使用相同的依賴注入 - 您不需要使用服務爲您完成工作。 – 2014-03-03 16:15:52

+0

現在可能是這樣。當我最初回答這個問題的時候並不是這樣。 – 2014-03-04 02:56:16

+1

我自此也發現可以從域對象(或domainClass.grailsAppliction)調用getDomainClass()。getGrailsApplication()來獲取GrailsApplication。它看起來像Grails 2.0一樣 – 2014-03-04 14:28:39

-1

大多數taglibs依賴於來自控制器的數據,所以通常不可能重用它們,而其他人則關注視圖邏輯,所以往往不是你想要放入域類的東西。

不過,我敢肯定,你有你的理由,所以也許的taglib的來源將有所幫助:

class ResourceTagLib { 

    def externalResourceServerService 

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

即注入externalResourceServerService到你的域類,其餘的應該很簡單。

+0

謝謝。 我本來也希望能夠工作。我做 高清tstLink = externalResourceServerService.resourceLinkTo(DIR: 「文檔/ $ {標識符衝」,文件:originalFileName) 但得到 法無簽名:ExternalResourceServerService.resourceLinkTo()的參數類型是適用的:(java的.util.LinkedHashMap)values:[[dir:docs/279a5b71-b05f-4d62-be7b-72a805b005e0,file:me.jpeg]] – 2010-01-29 17:54:37

+0

所以看起來我只是需要獲得正確的數據類型。這不起作用或者def tstLink2 = externalResourceServerService.resourceLinkTo(「docs/$ {identifier}」。toString(),originalFileName) 帶或不帶toString()。 – 2010-01-29 18:08:51

相關問題