【发布时间】: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 {}块中的更多条目。 -
相关代码是
compareTomethod ofRegexUrlMapping,现在看起来还是一样的规则。 -
您是否尝试将映射日志添加到您的 Log4j 配置中以查看匹配是如何完成的?也许如果您将该日志粘贴到问题中,您可以帮助我们弄清楚发生了什么。您必须添加的行是:all 'org.codehaus.groovy.grails.web.mapping'
标签: grails