
在 Revel 框架中,若将控制器(如 APP2)置于 controllers/new/ 子目录下,其包名必须与目录结构一致(即 package new),且路由路径需显式包含子目录名(如 /new/v2/show),否则框架无法定位控制器。
在 revel 框架中,若将控制器(如 app2)置于 `controllers/new/` 子目录下,其包名必须与目录结构一致(即 `package new`),且路由路径需显式包含子目录名(如 `/new/v2/show`),否则框架无法定位控制器。
Revel 框架通过包名 + 文件路径双重机制解析控制器,而非仅依赖文件位置。当控制器位于子目录(如 controllers/new/app2.go)时,必须满足以下两个关键条件,否则会报错 failed to find controller APP2:
✅ 1. 正确声明包名
app2.go 的包名必须与其所在目录名一致(即 package new),而非统一使用 controllers:
// controllers/new/app2.go
package new // ← 关键:必须为 "new",而非 "controllers"
import (
"github.com/revel/revel"
)
type APP2 struct {
*revel.Controller
}
func (c APP2) Show() revel.Result {
return c.RenderText("APP2 show")
}❌ 错误示例(包名仍为 controllers):
package controllers // ← Revel 将忽略此文件,因路径不匹配
✅ 2. 路由路径需体现子目录层级
在 conf/routes 中,控制器前缀需与包名对应。Revel 会将包名 new 映射为路径前缀 /new,因此路由应写为:
GET /v1/show controllers.APP1.Show GET /new/v2/show new.APP2.Show // ← 正确:包名 + 方法名,路径含 "/new"
? 原理说明:Revel 在启动时扫描 controllers/ 下所有 Go 文件,按 package 名组织控制器命名空间。package new 的控制器自动归属到 new. 命名空间,其路由路径默认前置 /new/(除非显式配置 APP_NAME 或重写 ControllerName)。
✅ 补充建议
- 推荐在 app2.go 中添加 import "your-app-name/app"(若需访问 App 全局配置);
- 运行前执行 revel run your-app-name,观察启动日志中是否列出 new.APP2 —— 若未出现,说明包名或路径有误;
- 避免在子目录中混用 package controllers,这会导致 Revel 忽略该文件。
遵循以上规范后,/new/v2/show 即可正常访问,彻底解决 “failed to find controller” 错误。


















