Spring MVC - код ошибки 406 с определенным параметром URL-адреса

Я разрабатываю приложение Spring MVC с REST API.

У меня есть этот метод в контроллере:

@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
  • Accept-Language: fr-FR, fr; q = 0,8, en-US; q = 0,6, en; q = 0,4
  • Cache-Control: без кеширования
  • Cookie: _ga = GA1.1.486025197.1475764350; JSESSIONID = 6716A5824088BC0F46A6B74D5FB25A3E
  • Хост: localhost: 8080
  • Пользовательский агент: Mozilla / 5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit / 537.36 (KHTML, как 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
  • Accept-Language: fr-FR, fr; q = 0,8, en-US; q = 0,6, en; q = 0,4
  • Cache-Control: без кеширования
  • Cookie: _ga = GA1.1.486025197.1475764350; JSESSIONID = 6716A5824088BC0F46A6B74D5FB25A3E
  • Хост: localhost: 8080
  • Пользовательский агент: Mozilla / 5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit / 537.36 (KHTML, как Gecko) Chrome / 54.0.2840.71 Safari / 537.36

Я получаю код ошибки 406 - неприемлемо

Я использую такие запросы везде в проекте, и у меня никогда не было таких проблем. Параметр roomId по-прежнему имеет обычное целочисленное значение. Как это может вызвать проблему с Spring Mvc? Заголовки и рабочий код остались прежними.

Когда я помещаю точку останова в первую строку метода findBySiteAndRoom, в первом случае она достигает точки. Но во втором случае он возвращает код ошибки 406 до достижения точки останова.

Спасибо заранее за вашу помощь.


person Rémi NUYTS    schedule 11.11.2016    source источник
comment
Когда я передаю идентификатор комнаты в requestparam, а не в переменной пути, он работает с roomId I1.A.123: localhost: 8080 / api / activity / Когда я добавляю дополнительное слово после roomId, оно работает с идентификатором комнаты I1.A.213: localhost: 8080 / api / activity / room / I1.A.123 / Как мы можем это объяснить? Это ошибка в Spring MVC?   -  person Rémi NUYTS    schedule 11.11.2016
comment
Когда я добавляю / сразу после значения roomId, он тоже работает: localhost: 8080 / api / activity / roomId / I1.A.123 /   -  person Rémi NUYTS    schedule 11.11.2016
comment
ваше сопоставление пути идет @RequestMapping (значение = / roomId / {roomId}, производит = application / json) или @RequestMapping (value = / room / {roomId}, производит = application / json)? (roomId vs room)   -  person kuhajeyan    schedule 11.11.2016
comment
Отображение пути - @RequestMapping (значение = / roomId / {roomId}, производит = application / json)   -  person Rémi NUYTS    schedule 14.11.2016


Ответы (1)


Я нашел какое-то исправление. Я создал конфигурацию Spring, которая расширяет WebMvcConfigurerAdapter, и переопределил метод configureContentNegotiation следующим образом:

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

С этим параметром работает отлично.

Но я до сих пор не понимаю, чем можно объяснить, что с идентификатором комнаты I1.A.122 он работает, а с идентификатором комнаты I1.A.123 - не работает.

person Rémi NUYTS    schedule 14.11.2016