2014-07-26 49 views
0

在Grails docs中,它讀取了按照約定拾取了駐留在/conf中的過濾器類。如何在Grails中重用過濾器

我們希望將所有過濾器存儲在插件中;有選擇地配置特定的使用,但我找不到一個演示這個例子。

如果這是我的過濾器...

class ParameterManipulationFilters { 
    def filters = { 
     paramFilter(controller: '*', action: '*') { 
      before = { 
       if (...) { 
        doSomething() 
        return true 
       } 
      } 
     } 
    } 
} 

...一切工作正常/conf的時候,但如果過濾器駐留在一個插件做什麼呢?

過濾器上的docs對與此功能相關的彈簧豆很淡;不知道是否CompositeInterceptor是我需要手動配置來實現這一點。

回答

2

插件可以按照應用程序可以定義的方式在grails-app/conf/下定義過濾器。如果應用程序使用該插件,默認情況下,該過濾器將在應用程序中播放。你不必做任何特別的事情來實現這一點。

你根本不用做任何事情,CompositeInterceptor

只要有選擇地配置哪些使用,你有很多選擇。你可以這樣做的一種方式是允許應用程序在Config.groovy中啓用或禁用過濾器。

考慮一個名爲alpha的插件。在該插件定義是這樣的......

// grails-app/conf/alpha/JeffFilters.groovy 
package alpha 

class JeffFilters { 

    def isEnabled = true 

    def filters = { 
     // only configure the filter is if is enabled... 
     if(isEnabled) { 
      all(controller:'*', action:'*') { 
       before = { 
        println 'JeffFilters.before is running...' 
       } 
      } 
     } 
    } 
} 

該插件可以做這樣的事情啓用/它提供禁用過濾...

// AlphaGrailsPlugin.groovy 
class AlphaGrailsPlugin { 

    // ... 

    def doWithApplicationContext = { ctx -> 
     if(application.config.grails.myfilterconfig?.disableJeffFilter) { 
      ctx.getBean('alpha.JeffFilters')?.isEnabled = false 
     } 
    } 

    // ... 

}

默認alpha.JeffFilters將被啓用。應用程序(而不是插件)可以禁用特定的過濾器,這樣的事情...

// grails-app/conf/Config.groovy 

// ... 
grails.myfilterconfig.disableJeffFilter=true 

當然,你可以圍繞協調它的其他方式,因此在過濾器默認情況下禁用,如果更有意義爲您的應用程序。

我希望幫助。

+0

看起來不錯,順便說一句,過濾器實現了一個接口,我可以使用'ctx.getBeansOfType(class)'進行掃描?我寧願在「doWithApplicationContext」中按類搜索,而不知道過濾器的顯式名稱。 – raffian

+0

我不這麼認爲,但在'doWithApplicationContext'中,您可以執行類似於'def filterNames = application.getArtefacts('Filters')*。name'或'def fullFilterNames = application.getArtefacts('Filters')*。fullName' 。 –

+0

要小心如果您要動態發現過濾器名稱,然後強制我在上面的答案中描述的方法。當然,並非所有的過濾器都具有'isEnabled'屬性。如果你要走這條路線,你需要動態地檢查屬性是否存在,或者做一些事情來處理這個事實。 –

相關問題