Grails捕获所有url映射,但有例外

Grails捕获所有url映射,但有例外,grails,urlmappings.groovy,Grails,Urlmappings.groovy,我正在尝试创建一个模拟rest服务。这基本上有两个组成部分。我需要一个带有操作和视图的控制器,该控制器允许我创建ResourceMappings,其中我在uri和我将传回的模拟响应之间创建映射。第二个组件是每个其他url的一个catch-all-Grails url映射,这样当它们到达这个应用程序的uri时,它们将被发送到我的catch-all控制器,该控制器将返回它们之前创建的映射响应 例如。。。我转到url。此url是“全部捕获”规则的例外。它让我看到了一些视图,这些视图允许我创建RESTU

我正在尝试创建一个模拟rest服务。这基本上有两个组成部分。我需要一个带有操作和视图的控制器,该控制器允许我创建ResourceMappings,其中我在uri和我将传回的模拟响应之间创建映射。第二个组件是每个其他url的一个catch-all-Grails url映射,这样当它们到达这个应用程序的uri时,它们将被发送到我的catch-all控制器,该控制器将返回它们之前创建的映射响应

例如。。。我转到url。此url是“全部捕获”规则的例外。它让我看到了一些视图,这些视图允许我创建RESTURI映射。在这里,我创建了映射/mockservice/test,并用text/plain的内容类型给它一个响应“thisatest”。现在,如果我转到url,我应该点击catch all,它将我发送到一个控制器,该控制器返回一个内容类型为text/plain的页面,并响应“This is a test”

我尝试了以下方法,但似乎不起作用。有人有什么想法吗

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有多长,所以我宁愿使用**来捕获所有异常,也就是我遇到的少数异常。

我不确定这一点,但我认为定义URL映射的顺序很重要。因此,请尝试在mappings闭包的开头列出您的特殊情况的URL映射,然后列出一般情况(使用**的情况)。一定要让我知道这是否有效:)

我终于找到了答案。我需要将WEB-INF包含在我的列表中以排除。我现在使用staticexcludes字段以及验证器来排除特定的控制器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')
}
}
我决定排除所有不应该是我的rest url的url映射。其中包括/images、/css、/js和/WEB-INF。我现在可以创建任意长度的URL,并将它们转到我的“一网打尽”控制器。如果此人转到基本url或RESTMappingURL集,那么他们将被带到crud页面,在那里他们可以创建新的rest资源映射。如果我想创建任何其他的控制器和视图,我想围绕catch-all控制器进行操作,我可以简单地将其添加到我的验证器中,并使它们正常运行


另外,您可能会注意到我使用的是?在接球后,一切都好。这似乎使我的“一网打尽”适用于服务器名称后只有一个单词的URL,如
http://server.com:1234/something.

Vithun,我之前确实尝试过你的想法,但没有达到预期效果。显然,顺序没有直接关系,您不能先放置更具体的url映射,然后再放置更一般的url映射。谢谢你的建议。