我正在尝试创建一个模拟休息服务。基本上有两个组成部分。我需要一个带有动作和视图的控制器,允许我创建ResourceMappings,我在uri和模拟响应之间创建一个映射,我将传回。第二个组件是每个其他URL的全能Grails url映射,这样当它们点击此应用程序的uri时,它们将被发送到我的catch所有控制器,它将返回它们之前创建的映射响应。
例如......我转到网址http://someserver.com:1234/restMapping/list。此url是catch all规则的例外。它带我一些观点,允许我创建一个休息uri映射。在这里,我创建了映射/模拟服务/测试,并为其提供了响应“这是一个测试”,其内容类型为text / plain。现在,如果我转到网址http://someserver.com:1234/mockservice/test,我应该点击捕获所有发送给控制器的控制器,该控制器返回内容类型为text / plain的页面和响应“这是测试”。
我尝试过以下内容,似乎无法正常工作。有没有人有任何想法?
static mappings = {
"/$control/**" {
controller = "catchAllHandler"
action = "index"
constraints {
control(validator: {!['restMapping','css','js','images'].contains(it)})
}
}
"/$controller/$action?/$id?"{
}
"/"(controller:"restMapping", action="index")
"500"(view:'/error')
}
有趣的是,当我摆脱**并添加大量额外的变量,如$ s1?/ $ s2?/ $ s3?等等它似乎确实有效。问题是我不知道我试图映射的uri有多长,所以我宁愿使用**来捕获所有异常,除了我有的少数例外。
答案 0 :(得分:1)
我终于明白了。我需要在列表中包含WEB-INF才能排除。我现在使用static exludes字段和验证器来排除特定的控制器URL。
class UrlMappings {
static excludes = ["/images/*","/css/*","/js/*","/WEB-INF/*"]
static mappings = {
"/restResourceMapping/$action?/$id?"{
controller = "restMapping"
}
"/$control/?**" {
controller = "catchAllHandler"
action = "index"
constraints {
control(validator: {!['restMapping'].contains(it)})
}
}
"/"(controller:"restMapping", action="index")
"500"(view:'/error')
}
}
我决定只排除所有永远不应该是我的其他网址的网址映射。这些包括/ images,/ css,/ js和/ WEB-INF。我现在可以创建任何长度的网址,让他们去找我所有的控制器。如果此人转到基本URL或restMapping网址集,则他们将被带到crud页面,在那里他们可以创建新的rest资源映射。如果我想创建任何其他控制器和视图,我想绕过catch all控制器,我可以简单地将它添加到我的验证器并使它们正常处理。
你也可能会注意到我正在使用?在/之后赶上了。这似乎使得我的捕获所有与url一起工作,在http://server.com:1234/something.
答案 1 :(得分:0)
我不确定这一点,但我认为定义URL映射的顺序非常重要。因此,请尝试在映射关闭开始时列出特殊情况的URL映射,然后列出一般情况(使用**的映射)。请告诉我这是否有效:)