Проблема с параметрами Spring MVC @RequestMapping

Поиск отображения запроса Spring MVC для ближайшего соответствия параметрам. Сегодня мы столкнулись с хорошим примером того, почему эта текущая реализация проблематична. у нас есть 2 функции:

@RequestMapping(method = Array[RequestMethod](RequestMethod.DELETE), params = Array[String]("lastName", "firstName"), produces = Array[String]("application/json"))
def deletePersons1(request: HttpServletRequest, @RequestParam("lastName") lastName: String, @RequestParam("firstName") acref: String)
@RequestMapping(method = Array[RequestMethod](RequestMethod.DELETE), params = Array[String]("lastName", "birthDate"), produces = Array[String]("application/json"))
def deletePersons2(request: HttpServletRequest, @RequestParam("lastName") lastName: String, @RequestParam("birthDate") birthDate: Date)

HTTP-запрос:

DELETE http://host:port/deletePersons?lastName=smith&firstName=john&birthDate=08-10-2015

Пользователи хотели удалить только Смита и Джона, а также думали, что могут добавить дату рождения. Но так как первая функция не получает дату, а пользователь ошибся и ввел туда дату, то в нашем случае использовалась вторая функция, так как она была наиболее близкой к совпадению. до сих пор не знаю, почему второй, а не первый.

В результате все люди с фамилией Смит, родившиеся в..., были удалены.

Это реальная проблема! потому что мы хотели удалить только определенного человека, но в итоге удалили многих других.

Есть ли какое-нибудь решение для этого?


person igreenfield    schedule 07.09.2015    source источник


Ответы (1)


Обновлять:

Проблема возникла из-за того, что между вашими функциями были перекрывающиеся переменные, и пользователи пытались использовать их сочетание. Чтобы гарантировать, что эта конкретная проблема не повторится, вы можете явно указать, что вы не хотите принимать запросы, содержащие определенные дополнительные переменные для (когда этот параметр не нужен). Например, приведенный выше пример проблемы можно решить, изменив второе определение (обратите внимание на параметр !firstName):

@RequestMapping(method = Array[RequestMethod](RequestMethod.DELETE), params = Array[String]("lastName", "birthDate"), produces = Array[String]("application/json"))
def deletePersons2(request: HttpServletRequest, @RequestParam("lastName") lastName: String, @RequestParam("birthDate") birthDate: Date)

to:

@RequestMapping(method = Array[RequestMethod](RequestMethod.DELETE), params = Array[String]("!firstName", "lastName", "birthDate"), produces = Array[String]("application/json"))
def deletePersons2(request: HttpServletRequest, @RequestParam("lastName") lastName: String, @RequestParam("birthDate") birthDate: Date)
person Gergely Bacso    schedule 07.09.2015
comment
спасибо за исправление опечатки, но это была опечатка только в моем вопросе, а не в реальном сценарии. - person igreenfield; 07.09.2015
comment
В этом вы правы, но что, если перекрытие более сложное, больше перестановок. Мне нужно будет написать все нежелательные параметры? Разве не было бы здорово, если бы весна позволила мне сказать, что я хочу много только этих параметров? - person igreenfield; 08.09.2015
comment
Я думаю, что нет стандартного способа переключения этой интеллектуальной логики сопоставления запросов. Самое близкое, что я нашел, это эта тема: stackoverflow.com/questions/31364657/ - person Gergely Bacso; 09.09.2015
comment
Что вы думаете об этом билете Jira? - person igreenfield; 09.09.2015