2011-03-09 62 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