【问题标题】:Grails not matching url pattern with optional parameterGrails 不匹配带有可选参数的 url 模式
【发布时间】:2026-01-19 23:05:02
【问题描述】:

在 Grails 2.3.7 上,假设以下 url 映射..

"/foo/$number?"     (controller:'test', action:'actionOne')  
"/foo/$number?/bar" (controller:'test', action:'actionTwo')

..和控制器:

class TestController {
   def actionOne(){ render "Action_ONE: ${params.number}"  }
   def actionTwo(){ render "Action_TWO: ${params.number}" }
}

一切顺利...

/foo/1      //prints 'Action_ONE: 1'
/foo/2/bar  //prints 'Action_TWO: 2'
/foo//bar   //prints 'Action_TWO: null'
/foo//      //prints 'Action_ONE: null'

...但是

/foo   //prints 'Action_TWO: null'
/foo/  //prints 'Action_TWO: null'

如果/foo/$number? 中的number 是可选的,为什么/foo/foo/ 映射到actionTwo()

【问题讨论】:

  • 这可以在 2.4.2 中复制。对我来说似乎是一个错误,你可以在这里提出一个 JIRA 问题jira.grails.org/browse/GRAILS
  • 如果可选组件不在 URI 的末尾,它们是否应该工作?
  • 不,订购不相关。最具体的映射获胜,但“最具体”的规则没有正式记录。上次我查看代码(在 2.2.x 中)时,获胜的映射将是具有以下第一个的映射:(a) 更少的 ** 双通配符,(b) 更少的单通配符,(c) 更多静态路径段,(d) 更靠左的第一个通配符或 (e) 在其 constraints {} 块中的更多条目。
  • 相关代码是compareTo method of RegexUrlMapping,现在看起来还是一样的规则。
  • 您是否尝试将映射日志添加到您的 Log4j 配置中以查看匹配是如何完成的?也许如果您将该日志粘贴到问题中,您可以帮助我们弄清楚发生了什么。您必须添加的行是:all 'org.codehaus.groovy.grails.web.mapping'

标签: grails


【解决方案1】:

在下面两行

"/foo/$number?"     (controller:'test', action:'actionOne')  
"/foo/$number?/bar" (controller:'test', action:'actionTwo')

您已在 url 中将 number 定义为可选,因为您使用了 "?" .更改“$number?”到“$number”中

 "/foo/$number?/bar" (controller:'test', action:'actionTwo')

第二行,它应该可以正常工作。

这里是url映射的详细信息https://grails.org/version/URL+mapping/8

【讨论】:

    最近更新 更多