Spring Boot @RequestMapping通配符绕过优先级规则

时间:2019-05-23 06:31:27

标签: spring spring-boot

我在Spring Boot Rest Controller中通过@RequestMapping(GET)映射了以下路由

/base/{baseName}
/base/{baseName}/next/{nextName}

我也有以下通配符路由

1. /base/{baseName}/**
2. /base/{baseName}/next/{nextName}/*

在以下情况下应做的工作

GET /base/baseName
GET /base/baseName/foo                  # Hits 1
GET /base/baseName/foo/bar/etc          # Hits 1

GET /base/baseName/next/nextName
GET /base/baseName/next/nextName/foo    # Hits 2

唯一不起作用的情况是

GET /base/baseName/next/nextName/foo/bar... # Hits 1

因为我希望它打到路线 2

这是行不通的,因为Spring Boot中的匹配优先级指示通配符路由1和2具有相同的值(每个通配符1点,每个模板1点)。

由于路由2不能匹配无限目录,所以它不起作用。如果要添加其他通配符,则路由1始终优先。

是否可以更改优先级规则或重组映射?

1 个答案:

答案 0 :(得分:0)

这些是蚂蚁风格的正则表达式,其中/*表示1且仅是一个级别,而/**表示多个级别。因此它确实会与第一个匹配,因为它根本不匹配第二个。您还需要将/**添加到第二个。或者,如果您想要1或2个目录,请添加其他路径映射({value需要一个String[]!)。

根据需要使用/**或第二个映射。

@RequestMapping(value="/base/{baseName}/next/{nextName}/**")

或第二个映射(如果您只想深入1或2层)。

@RequestMapping(value= { 
    "/base/{baseName}/next/{nextName}/*", 
    "/base/{baseName}/next/{nextName}/*/*" })