2011-05-13 57 views
0

我正在尝试创建一个模拟休息服务。基本上有两个组件。我需要一个具有动作和视图的控制器,它允许我创建ResourceMappings,并在其中创建一个uri和我将传回的模拟响应之间的映射。第二个组件是所有其他URL的全部Grails url映射,以便当它们碰到这个应用程序的URI时,它们将被发送到我的catch所有控制器,它将返回它们之前创建的映射响应。Grails捕获所有的url映射,但有例外

例如...我转到url http://someserver.com:1234/restMapping/list。这个网址是catch all规则的例外。它使我能够创建一个休息uri映射。在这里,我创建了映射/模拟服务/测试,并给它一个内容类型为text/plain的响应“This is a test”。现在,如果我去的url http://someserver.com:1234/mockservice/test我应该击中所有发送给控制器的所有内容,该控制器返回内容类型为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多长时间,所以我宁愿使用**来捕捉所有例外情况,但我有一些例外情况。

回答

0

我不确定这一点,但我认为其中定义了URL映射的命令非常重要。因此,请尝试在映射关闭开始处列出特殊情况下的URL映射,然后列出一般情况(使用**的情况)。请让我知道这是否工作:)

+0

Vithun,我确实尝试过你的想法,并没有得到预期的效果。显然这个顺序没有直接的关系,你不能把更具体的url映射放在第一个和更通用的映射之后。 (还是)感谢你的建议。 – gaoagong 2011-05-16 17:19:39

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') 
} 
} 

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

你也可能注意到我正在使用?在/之后的所有权利。这似乎使它所以我赶上所有的作品与url只有一个字后面的服务器名称http://server.com:1234/something.