Grails 2.1.3是否支持不同包下存在同名的控制器?
Grails 2.1.3 不同包下同名控制器实现方案
可行性确认
Grails 2.1.3 完全支持在不同包下创建同名控制器,你遇到的逻辑混淆问题,是因为Grails默认URL映射规则会优先按控制器名称匹配,默认忽略包名导致路由冲突,只需修改配置即可解决。
具体操作步骤
- 按业务分层创建对应包结构的同名控制器
示例结构参考:
UI层控制器路径:grails-app/controllers/com/yourproject/ui/UserController.groovy
REST接口控制器路径:grails-app/controllers/com/yourproject/api/UserController.groovy
两个控制器分别编写对应业务逻辑即可。 - 显式配置URL映射区分路由
打开grails-app/conf/UrlMappings.groovy,添加带包名约束的路由规则,示例如下:// UI层控制器统一加/ui前缀 "/ui/$controller/$action?/$id?"{ constraints { controller namespace: 'com.yourproject.ui' } } // REST接口控制器统一加/api前缀 "/api/$controller/$action?/$id?"{ constraints { controller namespace: 'com.yourproject.api' } } - 验证路由配置生效
执行命令grails url-mappings-report,查看输出的路由表,确认/ui/user/*指向UI包的UserController,/api/user/*指向API包的UserController即可。
优化建议
如果后续需要调整包结构,可以用控制器内声明命名空间的方式简化配置:
- 在两个控制器内分别添加命名空间声明
UI层控制器示例:
package com.yourproject.ui class UserController { static namespace = 'ui' // 原有业务逻辑 }
REST接口控制器示例:
package com.yourproject.api class UserController { static namespace = 'api' // 原有业务逻辑 }
- 调整URL映射配置,直接匹配命名空间即可:
"/ui/$controller/$action?/$id?" { namespace = 'ui' } "/api/$controller/$action?/$id?" { namespace = 'api' }
- 每次修改配置后建议先执行
grails clean清除缓存后再启动项目,避免旧编译文件导致逻辑异常。
内容的提问来源于stack exchange,提问作者Kamèl Romdhani
相关产品推荐
相关产品推荐

