我在从Grails 2升级到Grails 3时遇到了一个问题。在我的Grails 2项目中,我有一个UrlMappings.groovy文件,如下所示:
class UrlMappings {
static mappings = {
//"/$controller/$action?/$id?(.$format)?"{
// parseRequest = false
// constraints {
// apply constraints here
// }
//}
"/$controller/$id" {
action = [GET: "show", PUT: "update",
DELETE: "delete"]
constraints {
// to constrain the id to numeric, uncomment the following:
//id matches: /\d+/
}
}
"/$controller/$action" {
constraints {
action matches: /external.*/
}
}
"/$controller" {
action = [GET: "list", POST: "create"]
parseRequest = true
}
"/$controller/$action/$id" {
}
"/$controller/search" {
action = [POST: "search"]
parseRequest = true
}
"/$controller/count" {
action = [GET: "count"]
}
"/"(view:"/index")
"500"(controller: 'error')
}
}
这很有效,因为当使用某种格式的URL时会自动触及某个操作(例如GET http://localhost:8090/api/test会触及TestController的列表操作)。
在我的新Grails 3项目中,我已将映射移动到正确的位置(grails-app / controllers / my.project.package),并在文件顶部指定包。我希望行为保持与上面示例中指定的相同。但是,我现在点击端点时看到内部服务器错误。
我相信我收到了内部服务器错误,因为我的TestController中没有索引操作,并且URL GET http://localhost:8090/api/test正在尝试点击索引操作而不是列表操作。
我已经为新旧项目生成了URL映射报告,我看到Grails 3项目的URL映射报告包含默认的URL映射(| * | /${controller}/${action}?/${id}?(.${format)? | Action: (default action) |
),即使它在URL映射中被注释掉了。执行清理并从URLMappings.groovy文件中删除注释掉的位后,仍会生成此信息。这个默认映射可能是问题吗?如果是这样,有没有办法阻止应用程序使用它?
我尝试过的一件事是在controller(validator: { return false })
映射的约束块中使用"/$controller/$action?/$id?(.$format)?"
之类的约束。我尝试过的另一件事是为我的自定义URL映射使用不同的格式,如
get "/$controller/$id"(action: "show")
put "/$controller/$id"(action: "update")
delete "/$controller/$id"(action: "delete")
get "/$controller"(action: "list")
post "/$controller"(action: "create")
post "/$controller/search"(action: "search")
get "/$controller/count"(action: "count")
不幸的是,我对这些解决方案都没有任何好运。我确实很幸运使用静态控制器名称(例如"/test" { controller = "test", action = [GET: "list", POST: "create"] }
),但我必须为许多不同的控制器执行此操作,这对我来说并不是很好。
如果有人解决或解决了这个问题,请告诉我。我将不胜感激!