当应用程序控制器名称与插件的Controller名称冲突时,推荐的方法是什么?
我见过这些Grails JIRA: GRAILS-4240 GRAILS-1243
...而Burt Beckwith对这两个主题的回复意味着唯一的办法就是重命名一个控制器(大概是应用程序控制器,因为黑客插件代码是不可取的)
How to use the package name to differentiate between classes in grails?
How to extend/override controller actions of plugins?
然而,Burt自己的spring-security-ui插件提倡命名应用程序Controller 与插件控制器相同的确切方法 - 请参阅spring-security-ui docs。
这种方法实际上似乎在开发模式(grails run-app)和应用程序部署为WAR时都有效。那么这个功能可以依赖吗?如果是,那么Controller冲突解决规则是什么? grails docs没有提及它。 Perhasps Burt可以分享他的见解吗?
有一个像grails这样的“插件”架构,甚至没有一个基本的命名空间设施来处理这样的冲突,这对我来说似乎很糟糕......
答案 0 :(得分:6)
问题在于,虽然您可以将包用于任何工件,但控制器的约定是删除包,并使用“Controller”来创建URL,例如PersonController - > /应用程序的名字/人/ 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的评论中引用的插件看起来很有趣。