我对此很纳闷,这是我之前遇到的,只是解决了很多行与行之间的映射问题。
说我想使用旧的/标准映射的Grails 3.3应用程序具有几个屏幕(页面):
static mappings = {
"/$controller/$action?/$id?(.$format)?"{
constraints {
// apply constraints here
}
}
}
但是我还想要一个(很小的)API样式映射,类似:
static mappings = {
get "/api/$controller(.$format)?"(action:"index", namespace:'api')
get "/api/$controller/$id(.$format)?"(action:"show", namespace:'api')
post "/api/$controller"(action:"save", namespace:'api')
put "/api/$controller/$id"(action:"updateStatus", namespace:'api')
patch "/api/$controller/$id"(action:"patch", namespace:'api')
delete "/api/$controller/$id"(action:"delete", namespace:'api')
}
普通控制器没有名称空间,我希望通过grails默认样式对其进行访问。但是我想让API可以访问(包括使用createLink()进行反向映射等,如果可能的话,可以使事情保持简单。
我尝试了多种配置,并且发现以下内容获得了正向映射(通过URL找到控制器和操作),但是反向映射始终默认为“ / $ controller / $ action?”。 /$id?(.$format)?”样式链接(我希望为这些链接生成404,尽管我可以继续访问它)。例如。完整的代码是:
class UrlMappings {
static mappings = {
get "/api/$controller(.$format)?"(action:"index", namespace:'api')
get "/api/$controller/(.$format)?"(action:"index", namespace:'api')
get "/api/$controller/$id(.$format)?"(action:"show", namespace:'api')
post "/api/$controller"(action:"save", namespace:'api')
put "/api/$controller/$id"(action:"updateStatus", namespace:'api')
patch "/api/$controller/$id"(action:"patch", namespace:'api')
delete "/api/$controller/$id"(action:"delete", namespace:'api')
"/$controller/$action?/$id?(.$format)?"{
constraints {
// apply constraints here
}
}
"/"(view:"/index")
"500"(view:'/error')
"404"(view:'/notFound')
}
}
是否有按照我想要的方式使它工作的方法-例如具有反向网址-例如createLink(...)工作吗?我认为在其他应用程序的某个时刻,我使用了命名映射,但是这些似乎很快就失去了作用。
目前可以的话
"${createLink(namespace:'api', controller:'upload', action:'post')}"
当我想要的是/ api / upload时,结果是/ upload / post
最终(希望编辑)-这似乎比仅以我不希望使用反向映射的格式出现的URL更大。当仅使用控制器进行前向映射“工作”时,当我打开Grails Spring安全性时,我无法获得对URL的/ api / upload版本的访问权限,但我不是100%肯定,但是查看它显示的日志是因为代码无法找到控制器,因此无法找到@Secured注释。
答案 0 :(得分:0)
好吧,答案是获取url映射报告插件,或者其他人来检查您的代码。
基本上这是我的错字,经过更正后,我的上一个配置运行良好。
首先-使用安全插件,您将获得404的403信息。
第二,通过createLink进行的反向映射将返回虚拟URL,而不是报告错误(例如,如果没有匹配的控制器,例如由于所述错字)。