2013-05-31 62 views
2

我有一臺服務器使用Spring來公開一些RestServices。我有〜20個服務,做幾乎總是同樣的事情:獲取,列出,保存...僅在第一次調用時調查HTTP 406錯誤代碼

在所有這些服務,我有一個請求,不表現得和別人一樣:

@RequestMapping(value = {"/{id}"}, method = RequestMethod.GET) 
@ResponseBody 
public Line get(@PathVariable(value = "id") int id) { 
    return lineService.getById(id); 
} 

問題:

  • 當我重新啓動服務器並第一次調用此特定請求時,我得到一個406錯誤代碼。

  • 在此之後,所有其他呼叫結束成功,返回合式JSON與HTTP 200代碼等

請求的接受頭包含「應用程序/ JSON」。

我嘗試添加這對requestMapping:

produces="application/json" 

看來某處,服務器後適應內容/類型的效應初探第一失敗,但我可以肯定不明白的地方。

我嘗試使用tomcat和jetty作爲後端服務器,並且兩者都出現錯誤。

任何想法?

編輯:

經過進一步調查,我發現在Tomcat的日誌這種差異。在第一次調用(HTTP 406),我可以看到這一點:

09:33:58.637 [http-bio-9090-exec-3] DEBUG o.s.o.jpa.EntityManagerFactoryUtils - Closing JPA EntityManager 
09:33:58.637 [http-bio-9090-exec-3] DEBUG o.s.w.a.FixedContentNegotiationStrategy - Requested media types is application/json (based on default MediaType) 
09:33:58.654 [http-bio-9090-exec-3] DEBUG o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - Resolving exception from handler [public com.mycompany.myproject.dto.MyClass com.mycompany.myproject.controller.patrimoine.LigneMobileController.get(int)]: org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation 
09:33:58.657 [http-bio-9090-exec-3] DEBUG o.s.w.s.m.a.ResponseStatusExceptionResolver - Resolving exception from handler [public com.mycompany.myproject.dto.MyClass com.mycompany.myproject.controller.patrimoine.LigneMobileController.get(int)]: org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation 
09:33:58.657 [http-bio-9090-exec-3] DEBUG o.s.w.s.m.s.DefaultHandlerExceptionResolver - Resolving exception from handler [public com.mycompany.myproject.dto.MyClass com.mycompany.myproject.controller.patrimoine.LigneMobileController.get(int)]: org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation 
09:33:58.657 [http-bio-9090-exec-3] DEBUG o.s.web.servlet.DispatcherServlet - Null ModelAndView returned to DispatcherServlet with name 'springServlet': assuming HandlerAdapter completed request handling 
09:33:58.657 [http-bio-9090-exec-3] DEBUG o.s.web.servlet.DispatcherServlet - Successfully completed request 
09:33:58.657 [http-bio-9090-exec-3] DEBUG o.s.s.w.a.ExceptionTranslationFilter - Chain processed normally 
09:33:58.657 [http-bio-9090-exec-3] DEBUG o.s.s.w.c.SecurityContextPersistenceFilter - SecurityContextHolder now cleared, as request processing completed 

在第二個電話,我可以看到這個(差別在第二行開始):

09:50:52.384 [http-bio-9090-exec-7] DEBUG o.s.o.jpa.EntityManagerFactoryUtils - Closing JPA EntityManager 
09:50:52.385 [http-bio-9090-exec-7] DEBUG o.s.w.s.m.m.a.RequestResponseBodyMethodProcessor - Written [[email protected]18949ad1] as "application/json;charset=UTF-8" using [org.springf[email protected]32a64bcd] 
09:50:52.385 [http-bio-9090-exec-7] DEBUG o.s.web.servlet.DispatcherServlet - Null ModelAndView returned to DispatcherServlet with name 'springServlet': assuming HandlerAdapter completed request handling 
09:50:52.385 [http-bio-9090-exec-7] DEBUG o.s.web.servlet.DispatcherServlet - Successfully completed request 
09:50:52.385 [http-bio-9090-exec-7] DEBUG o.s.s.w.a.ExceptionTranslationFilter - Chain processed normally 
09:50:52.385 [http-bio-9090-exec-7] DEBUG o.s.s.w.c.SecurityContextPersistenceFilter - SecurityContextHolder now cleared, as request processing completed 

因此,在第一大概,當我試圖將對象轉換爲JSON時,我得到了一些HttpMediaTypeNotAcceptableException。

+0

爲什麼如果示例中有Spring註釋(而不是JAX-RS),那麼您是否使用了Jersey?對這些技術會有一些誤解嗎? –

+0

經過對maven depasis的檢查之後,這是一個錯誤:我們不使用Jersey。我編輯了這個問題,謝謝。 –

+0

我認爲406是關於請求和響應的:當響應的Content-Type與請求的「Accept Header」不對應時,它會發生,或者我錯過了什麼?對於Spring處理程序映射,團隊和我正在接近這一點,仍在調查。 –

回答

1

我會開始像Fiddler這樣的東西,看看實際上通過電線上的位。

0

您是否嘗試在控制器方法的第一行設置斷點,即return lineService.getById(id);

我懷疑你會碰到那一行,但是如果你試圖用調試器「進入」那個方法,會出現一些初始錯誤。如果我的假設是正確的,則會拋出異常,導致帶有堆棧跟蹤的html頁面。接下來,您將看到406發生,因爲html頁面的媒體類型爲application/html,或類似的不能轉換爲application/json

+0

我試圖將這一行分成兩部分'Line line = lineService.getById(id)'和'return line;'放置一個斷點來查看返回行的結構。在這兩種情況下,生成的「線路」似乎都是格式良好的。當Spring試圖將其轉換爲JSON時,問題似乎就會發生。 –

0

鑑於您僅在重新啓動服務器後纔看到此錯誤,這讓我認爲這可能與延遲加載類有關。

嘗試使用在服務器啓動時初始化的servlet(即,其中load-on-startup的值爲1),那麼 - 在其init方法中 - 是指涉及將com.mycompany.myproject.dto.datagrid.LoadResult渲染爲json的所有類?

請記住,你要確保所有的類參與,通過類加載器加載的請求到來之前。

1

你說,接受頭包含application/json。我將通過發送請求開始調查而不指定可接受的內容類型。服務器響應中應該有一些相關的線索,當它不受特定內容類型的限制時。如果Web服務器在處理請求期間遇到任何錯誤,則通常傾向於將錯誤頁面格式化爲HTML。在這種情況下,內容類型當然是text/html,因此真正的問題會被406錯誤混淆。

相關問題