Grails使用异常捕获所有url映射

时间:2011-05-13 16:25:46

标签: grails urlmappings.groovy

我正在尝试创建一个模拟休息服务。基本上有两个组成部分。我需要一个带有动作和视图的控制器,允许我创建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有多长,所以我宁愿使用**来捕获所有异常,除了我有的少数例外。

2 个答案:

答案 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映射,然后列出一般情况(使用**的映射)。请告诉我这是否有效:)