Spring Boot @RequestMapping правила приоритета обхода подстановочного знака - PullRequest
0 голосов
/ 23 мая 2019

У меня есть следующие маршруты, сопоставленные через @RequestMapping (GET) в Spring Boot Rest Controller

/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 голосов
/ 23 мая 2019

Это регулярное выражение в стиле муравья, где /* означает 1 и ровно один уровень, а /** означает несколько уровней. Таким образом, он действительно будет соответствовать первому, поскольку он просто не соответствует второму. Вам также нужно будет добавить /** ко второму. Или, если вы хотите 1 или 2 каталога, добавьте дополнительное отображение пути (value занимает String[]!).

В зависимости от ваших потребностей используйте /** или второе отображение.

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

или второе отображение (если вы хотите пройти только на 1 или 2 уровня глубиной).

@RequestMapping(value= { 
    "/base/{baseName}/next/{nextName}/*", 
    "/base/{baseName}/next/{nextName}/*/*" })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...