【问题标题】:Spring MVC - Error code 406 with specific url parameterSpring MVC - 带有特定 url 参数的错误代码 406
【发布时间】:2016-11-11 14:35:25
【问题描述】:

我使用 REST API 开发了一个 Spring MVC 应用程序。

我在控制器中有这个方法:

@RequestMapping(value="/roomId/{roomId}",produces = "application/json")
public List<DayStatisticDto> findBySiteAndRoom(@PathVariable("roomId") String roomId, @RequestParam("timestamp") String timestamp, @RequestParam("pageSize") Integer pageSize) throws ParseException {
    List<DayStatisticDto> dayStatisticDtos = dayStatisticService.latestDailyStatisticsForRoom(getCurrentUserSiteCode(), roomId, pageSize, timestamp, false);
    return dayStatisticDtos;
}

当我提出这个获取请求时

http://localhost:8080/api/activities/roomId/I1.A.122?timestamp=2016-11-11T12:02:34.421+0100&pageSize=10

有了这个请求参数:

  • 接受:应用程序/json
  • 接受编码:gzip、deflate、sdch、br
  • 接受语言:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
  • 缓存控制:无缓存
  • Cookie:_ga=GA1.1.486025197.1475764350;JSESSIONID=6716A5824088BC0F46A6B74D5FB25A3E
  • 主机:本地主机:8080
  • User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36

我得到一个正确的 JSON 对象作为响应。

但是当我将参数“roomId”从 I1.A.122 更改为 I1.A.123 时:

http://localhost:8080/api/activities/roomId/I1.A.123?timestamp=2016-11-11T12:02:34.421+0100&pageSize=10

有了这个请求参数:

  • 接受:应用程序/json
  • 接受编码:gzip、deflate、sdch、br
  • 接受语言:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
  • 缓存控制:无缓存
  • Cookie:_ga=GA1.1.486025197.1475764350; JSESSIONID=6716A5824088BC0F46A6B74D5FB25A3E
  • 主机:本地主机:8080
  • User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36

我收到错误代码406 - 不可接受

我在项目中到处都使用这种请求,我从来没有遇到过这种问题。参数“roomId”仍然是一个普通的整数值。它如何与 Spring Mvc 产生问题?头文件和运行代码仍然完全相同。

当我在“findBySiteAndRoom”方法的第一行放置一个断点时,在第一种情况下它到达了该点。但是在第二种情况下,它在到达断点之前返回406错误代码。

提前感谢您的帮助。

【问题讨论】:

  • 当我在 requestparam 而不是路径变量中传递房间 ID 时,它与 roomId I1.A.123 一起使用:localhost:8080/api/activities/… 当我在 roomId 之后添加一个额外的单词时,它与房间一起使用ID I1.A.213:localhost:8080/api/activities/room/I1.A.123/… 我们该如何解释呢?它是 Spring MVC 中的错误吗?
  • 当我在 roomId 值之后添加一个“/”时,它也可以工作:localhost:8080/api/activities/roomId/I1.A.123/…
  • 你的路径映射去@RequestMapping(value="/roomId/{roomId}",produces = "application/json") 或@RequestMapping(value="/room/{roomId}",produces =“应用程序/json”)? (房间 ID 与房间)
  • 路径映射为@RequestMapping(value="/roomId/{roomId}",produces = "application/json")

标签: spring rest spring-mvc http-status-code-406


【解决方案1】:

我找到了一种解决方法。我创建了一个扩展 WebMvcConfigurerAdapter 的 Spring 配置,并像这样覆盖了“configureContentNegotiation”方法:

@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer.favorPathExtension(false);
}

有了这个参数,它就完美地工作了。

但我仍然不明白如何解释房间 ID I1.A.122 可以工作,而房间 ID I1.A.123 不能工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多