Grails如何解决控制器名称冲突?

Eri*_*ric 4 grails

当应用程序控制器名称与插件的Controller名称冲突时,建议的方法是什么?

我见过这些Grails JIRA: GRAILS-4240 GRAILS-1243

...和Burt Beckwith对这两个线程的回复意味着唯一的办法是重命名一个控制器(可能是应用程序控制器,因为黑客插件代码是不可取的)

如何使用包名来区分grails中的类?

如何扩展/覆盖插件的控制器动作?

但是,Burt自己的spring-security-ui插件提倡将应用程序控制器命名插件控制器的确切方法- 请参阅spring-security-ui docs.

这种方法实际上似乎在开发模式(grails run-app)和将应用程序部署为WAR时都有效.那么这个功能可以依赖吗?如果是,那么Controller冲突解决规则是什么?grails docs没有提及它.Perhasps Burt可以分享他的见解吗?

有一个像grails这样的"插件"架构,甚至没有一个基本的命名空间设施来处理这样的冲突,这对我来说似乎很糟糕......

Bur*_*ith 6

问题是,虽然您可以将包用于任何工件,但控制器的约定是删除包和"Controller"以创建URL,例如PersonController - >/appname/person/action_name.所以实际上一切都变得扁平化了.

在1.2及更多内容中,1.3更改了内容,因此插件与应用程序代码分开编译(并且首先编译),这使您有机会用应用程序的版本替换插件工件.由于您不应编辑插件代码,因此您可以灵活地使用相同的名称来扩展或替换插件工件.

当有两个类似命名的控制器时,我倾向于使用UrlMappings来解决这类问题.例如,假设您有一个允许低级CRUD操作的admin UserController和一个用户使用的常规UserController.我将管理员控制器命名为AdminUserController并将其映射到/ admin/user/*并保持UserController不变.管理员GSP将在views/adminUser中,其他人将在views/user中,因此没有冲突.这具有能够轻松保护的额外好处 - map/admin/** - > ROLE_ADMIN.这些约定很方便,但这是一个简单的配置步骤,可以解决这个问题.

好消息是GRAILS-1243肯定会在2.0中实现,可能在1.4中实现.Kim Betti在GRAILS-1243的评论中引用的插件看起来很有趣.