春季@RequestMapping“不包含”正则表达式

时间:2018-08-24 11:49:59

标签: java regex spring request-mapping

我有这个RequestMapping:

    @RequestMapping(value = "/route/to-{destination}-from-{departure}.html", method = {RequestMethod.GET, RequestMethod.HEAD})

我想添加该RequestMapping:

    @RequestMapping(value = "/route/to-{destination}.html", method = {RequestMethod.GET, RequestMethod.HEAD})

因此它可以服务所有“不离港”的路线。但是,这会产生冲突,因为“ / route / to-destination-from-departure” URL实际上也与第二个RequestMapping匹配。 足够公平,所以我的解决方案是指定一个正则表达式:

    @RequestMapping(value = "/route/to-{destination:^((?!-from-).)+}.html", method = {RequestMethod.GET, RequestMethod.HEAD})

因此,如果“目标”包含“ -from-”,则RequestMapping将不匹配。

而且...它不起作用!网址“ /route/to-barcelona-from-paris.html”已成功通过第一个RequestMapping提供,但网址“ /route/to-barcelona.html”却根本未提供...我缺少什么? / p>

注意:我不希望使用Java解决方案,例如只有一个“ / route / to- {destination}” RequestMapping,然后检查“目标”是否包含“ -from-” .. :)另外,我可以不会因为SEO而改变这些路线...

2 个答案:

答案 0 :(得分:1)

您可以使用

"/route/to-{destination:(?!.*-from-).+}.html"

^锚将搜索字符串的开头,并且此处将失败。

除行换行符以外的任何0+字符之后,(?!.*-from-)否定的超前查找将使任何包含-from-的输入失败。

.+模式将消耗行末字符以外的全部1个或更多字符。

答案 1 :(得分:0)

尝试使用此:->

{目的地:^(?! from)+}

{目的地:^((?!-from-)。)+}