2016-11-11 40 views
0

我使用REST API開發Spring MVC應用程序。Spring MVC - 具有特定url參數的錯誤代碼406

我有一個控制器,這個方法:

@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; 
} 

當我做這個get請求

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

有了這個請求參數:

  • 接受:應用程序/ json
  • 接受編碼:gzip,放氣,SDCH,BR
  • 接受語言:FR-FR,FR; Q = 0.8,的en-US; Q = 0.6,連接; Q = 0.4
  • 緩存控制:無緩存
  • 曲奇:_ga = GA1.1.486025197.1475764350; JSESSIONID = 6716A5824088BC0F46A6B74D5FB25A3E
  • 主機:本地主機:8080
  • 的User-Agent:Mozilla的/ 5.0(Macintosh上;英特爾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

有了這個請求參數:

  • 接受: application/json
  • Accept-Encoding:gzip,deflate,sdch,br
  • Accept-Language:fr-FR,fr ; q = 0.8,en-US; q = 0.6,en; q = 0.4
  • Cache-Control:no-cache
  • Cookie:_ga = GA1.1.486025197.1475764350; JSESSIONID = 6716A5824088BC0F46A6B74D5FB25A3E
  • 主機:本地主機:8080
  • 的User-Agent:Mozilla的/ 5.0(Macintosh上;英特爾的Mac OS X 10_11_6)爲AppleWebKit/537.36(KHTML,例如Gecko)鉻/ 54.0.2840.71 Safari瀏覽器/ 537.36

我收到一個錯誤代碼406 - 不可接受

我在使用謨這樣的請求無處不在,我從未有過這種問題。參數「roomId」仍然是一個正常的整數值。它如何引起Spring Mvc的問題?標題和運行代碼仍然完全相同。

當我在「findBySiteAndRoom」方法的第一行放置一個斷點時,在第一種情況下它會到達該點。但在第二種情況下,它在到達中斷點之前返回406錯誤代碼。

非常感謝您的幫助。

+0

當我通過房間ID在requestparam而非pathvariable,它的工作與roomId I1.A.123:HTTP://本地主機:8080/API /活動/房間roomId = I1.A.123&時間戳= 2016 -11-11T12:02:34.421 + 0100 = pageSize的1 當我roomId後添加一個額外的詞,它的工作與房間ID I1.A.213:HTTP://本地主機:8080/API /活動/間/ I1.A.123/test?timestamp = 2016-11-11T12:02:34.421 + 0100&pageSize = 1 我們該如何解釋?這是Spring MVC中的錯誤嗎? –

+0

當我在roomId值後面添加「/」時,它也在工作:http:// localhost:8080/api/activities/roomId/I1.A.123 /?timestamp = 2016-11-11T12:02:34.421 + 0100&pageSize = 10 –

+0

@RequestMapping(value =「/ roomId/{roomId}」,produce =「application/json」) 或 @RequestMapping(value =「/ room/{roomId}」,產生= 「application/json」)? (roomId VS室) – kuhajeyan

回答

0

我發現了一種修復方法。我創建一個擴展WebMvcConfigurerAdapter一個Spring配置和我推翻這樣的「configureContentNegotiation」的方法:

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

使用此參數,它完美的作品。

但我還是不明白什麼可以解釋,與房間ID I1.A.122它的工作原理,並與房間ID I1.A.123這是行不通的。