Spring MVC @RequestMapping params问题

时间:2015-09-07 16:58:08

标签: java spring spring-mvc request-mapping

Spring MVC请求映射搜索最接近的参数匹配。 我们今天只是遇到了一个很好的例子,为什么当前的实现存在问题。 我们有两个功能:

@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

用户只想删除史密斯,约翰,并且还认为他们可以添加出生日期。 但是由于第一个函数没有得到日期并且用户犯了错误并且在那里放了一个日期,在我们的例子中,第二个函数被使用,因为它是最接近匹配的。我仍然不知道为什么是第二个,而不是第一个。

结果是所有姓氏史密斯出生于......的人都被删除了。

这是一个真正的问题!因为我们只想删除一个特定的人,但最终却删除了许多其他人。

有没有解决方案?

1 个答案:

答案 0 :(得分:1)

更新

问题来自于您的功能与尝试使用它们的用户之间存在重叠变量的事实。为了确保不会重现此特定问题,您可以明确声明您不希望接受包含某些额外变量的请求(当不需要该参数时)。例如,上面的示例问题可以通过更改( note the!firstName param)中的第二个定义来解决:

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