2011-03-09 61 views
4

當應用程序控制器名稱與插件控制器的名稱衝突時,推薦的方法是什麼?Grails如何解決控制器名稱衝突?

我看到這些的Grails JIRAs: GRAILS-4240 GRAILS-1243

...和伯特·貝克威思的答覆這兩個線程意味着,唯一的辦法就是因爲黑客重命名其中一個控制器(大概應用控制器插件代碼是不期望的)

How to use the package name to differentiate between classes in grails?

How to extend/override controller actions of plugins?

然而,伯特自己的春季安全的UI插件主張命名的應用程序控制器一樣插件控制器的精確方法 - 看spring-security-ui docs

這種做法實際上似乎在開發模式下工作(Grails的運行的應用程序),當應用程序被部署爲WAR。那麼這個功能可以依靠嗎?如果是這樣,控制器衝突解決規則是什麼? Grails文檔沒有提及它。 Perhasps Burt可以分享他的見解嗎?

擁有一個像Grails的一個「插件」的架構,甚至沒有基本的命名空間設施,以處理這樣看起來很破我的衝突......

回答

6

的問題是,雖然你可以使用包的任何工件時,控制器的約定是刪除包和「控制器」來創建URL,例如PersonController - >/appname/person/action_name。所以實際上一切都變平了。

在1.2更多的是在1.3的東西被改變爲使插件在應用程序代碼單獨編譯(和第一被編譯),這讓你有機會來替換應用程序的版本插件神器。由於您不應該編輯插件代碼,因此只需使用相同的名稱就可以靈活地擴展或替換插件工件。

我傾向於使用UrlMappings避開這樣的東西時,有兩個類似的命名控制器。例如,假設你有一個管理員UserController,允許低級別的CRUD操作和用戶使用的常規UserController。我將命名管理員控制器AdminUserController並將其映射到/ admin/user/*,然後按原樣保留UserController。管理員GSP將處於views/adminUser中,其他人將處於views/user中,因此不存在衝突。這有附加的好處,能夠輕鬆保護 - 地圖/管理員/ ** - > ROLE_ADMIN。約定很方便,但這是一個簡單的配置步驟,爲我解決了這個問題。

的好消息是,GRAILS-1243肯定會在2.0中實現,並可能在1.4。 Kim Betti在GRAILS-1243的評論中提到的插件看起來很有趣。

+0

謝謝伯特!我不確定我完全理解編譯順序如何發揮作用。由於我的FooController和插件的FooController位於不同的包中,因此它們都不會覆蓋其他的.class文件。兩個FooController.class文件都在WAR中。如此看來,Grails的有喜歡的應用程序,以插件的... – Eric 2011-03-09 13:12:01

+0

右一些查找邏輯,他們編譯成不同的文件夾,所以沒有.class文件衝突。在啓動時,找到工件的進程首先找到插件的工件,但是然後應用程序的工件替換它,因爲它具有相同的「工件」名稱。 – 2011-03-09 15:44:11