Spring MVC 3 RequestMapping 与正则表达式量词

Posted

技术标签:

【中文标题】Spring MVC 3 RequestMapping 与正则表达式量词【英文标题】:Spring MVC 3 RequestMapping with regular expresssion quantifiers 【发布时间】:2011-06-29 21:38:24 【问题描述】:

下面的方法失败了 “PatternSyntaxException:索引附近的未闭合计数闭合...”

@RequestMapping(value ="/id:[0-9|a-z]15")
public View view(@PathVariable final String id) 
  ...

看起来模式匹配器对字符串进行了太多修剪并丢失了最后一个 。

有没有人知道这个错误的解决方法?我不得不将限定词放到 "/id:[0-9|a-z]+" - 坦率地说,这很糟糕!

【问题讨论】:

@mdrg 破坏的是限定符,而不是表达式本身。我想 or 并不是真正需要的。 试过 : (value ="/id:[0-9|a-z]15, ") ? 【参考方案1】:

除了手动验证外,我认为这种情况没有任何好的解决方法。毕竟,name:regexp 语法的引入是为了解决映射之间的歧义,而不是为了验证。

@PathVariables 上的@Valid 可能是一个解决方案,但仅在 Spring 3.1 (SPR-6380) 中承诺。

也可以随时在Spring JIRA 中报告此错误,尽管我不希望他们很快修复它,因为路径变量处理代码已经很乱了。

【讨论】:

【参考方案2】:

这里有一个解决方案。它很丑,但它相当于你想要的:

@RequestMapping(value = "/id:[0-9a-z][0-9a-z][0-9a-z][0-9a-z]" +
        "[0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z]" +
        "[0-9a-z][0-9a-z][0-9a-z][0-9a-z]") // 15 repetitions of [0-9a-z]

如果这是获得你需要的唯一方法,你还不如使用这个怪物。

【讨论】:

哇!耻辱必须是32次。 15 只是帖子的一个随机数。现在我不得不争论这是否真的是“正确”的答案。 我可以把它拉成一个具有合理名称的静态最终字符串。我会给你一票纯粹的聪明。 :) @dom 有时一个邪恶的黑客是唯一的出路:-) 好吧,正则表达式 [0-9a-z]15 中有“x 次”表达式,或者如果与另一个控制器没有歧义,则 [0-9a-z]*然后在控制器中验证数字计数并提供一个很好的错误消息

以上是关于Spring MVC 3 RequestMapping 与正则表达式量词的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC 3 深入总结

Spring 3 MVC + 安全性

Spring 3 MVC:使用自定义验证器显示验证消息

Spring 3 MVC 和模态向导

Spring 3 MVC:在 MVC 控制器方法参数中公开会话范围的 bean

Spring MVC 从 2.5 到 3.0