【问题标题】:How does Grails resolve Controller name conflicts?Grails 如何解决控制器名称冲突?
【发布时间】:2011-07-11 13:39:09
【问题描述】:

当应用控制器名称与插件控制器名称冲突时,推荐的方法是什么?

我见过这些 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 插件提倡将应用程序控制器命名为插件控制器相同的确切方法 - 请参阅 spring-security-ui docs

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

拥有像 grails' 这样的“插件”架构,甚至没有基本的命名空间工具来处理这样的冲突,这对我来说似乎很糟糕......

【问题讨论】:

    标签: grails


    【解决方案1】:

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

    在 1.2 和更多的 1.3 中发生了一些变化,因此插件与应用程序代码分开编译(并且首先编译),这使您有机会用应用程序的版本替换插件工件。由于您不应该编辑插件代码,因此您可以灵活地扩展或替换插件工件,只需使用相同的名称即可。

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

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

    【讨论】:

    • 谢谢伯特!我不确定我是否完全理解编译顺序是如何发挥作用的。由于我的 FooController 和插件的 FooController 位于不同的包中,因此两者都不会覆盖对方的 .class 文件。两个 FooController.class 文件都在 WAR 中。所以看起来 Grails 有一些查找逻辑,它更喜欢应用程序而不是插件的......
    • 对,它们被编译到不同的文件夹,所以没有 .class 文件冲突。在启动时,查找工件的进程首先找到插件的工件,然后应用程序的工件替换它,因为它具有相同的“工件”名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 2017-05-31
    相关资源
    最近更新 更多