0

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

例如......我去网址http://someserver.com:1234/restMapping/list。此 url 是 catch all 规则的例外。它把我带到了一些允许我创建休息 uri 映射的视图。在这里,我创建映射 /mockservice/test 并给它响应“这是一个测试”,内容类型为 text/plain。现在,如果我访问 url 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 有多长,所以我宁愿使用 ** 来捕获我所拥有的少数异常中的所有异常。

4

2 回答 2

1

我终于弄明白了。我需要在我的列表中包含 WEB-INF 以排除。我现在使用静态排除字段以及验证器来排除特定的控制器 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')
}
}

我决定只排除所有不应该是我的任何其他 url 的 url 映射。其中包括 /images、/css、/js 和 /WEB-INF。我现在可以创建任意长度的 url 并让它们进入我的 catch all 控制器。如果该人转到基本 url 或 restMapping url 集,那么他们将被带到他们可以创建新的休息资源映射的 crud 页面。如果我想创建任何其他我想绕过 catch all 控制器的控制器和视图,我可以简单地将它添加到我的验证器并让它们正常处理。

此外,您可能会注意到我使用的是 ? 在 / 之后就可以了。这似乎使得我的所有内容都适用于在服务器名称后只有一个单词的 url,如 http://server.com:1234/something.

于 2011-05-16T17:25:27.923 回答
0

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

于 2011-05-15T20:31:00.143 回答