2015-09-07 5 views
1

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

@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) 

запрос НТТР:

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

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

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

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

Есть ли решение для этого?

ответ

1

Update:

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

@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) 

к:

@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) 
+0

спасибо за опечатку исправить, но это было только опечатка в моем вопросе не в реальном сценарии. – igreen

+0

Вы правы в этом, но что, если перекрытие сложнее, больше перестановок. Мне нужно будет написать все нежелательные параметры? Разве это не было бы здорово, если бы весна позволила мне сказать, что я хочу только такие параметры? – igreen

+1

Я думаю, что нет стандартного способа переключения этой интеллектуальной логики запроса-отображения. Самое близкое, что я нашел, это эта тема: http://stackoverflow.com/questions/31364657/can-spring-mvc-strictly-map-query-strings-to-request-parameters –