2

Spring を使用していくつかの RestServices を公開するサーバーがあります。取得、リスト、保存など、ほぼ常に同じことを行うサービスが 20 個ほどあります。

これらすべてのサービスの中で、他のサービスとは異なる動作をするリクエストが 1 つあります。

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

問題 :

  • サーバーを再起動して、この特定のリクエストを初めて呼び出すと、406 エラー コードが表示されます。

  • その後、他のすべての呼び出しは正常に終了し、HTTP 200 コードなどを含む整形式の JSON が返されます。

リクエストの Accept ヘッダーには「application/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

2 回目の呼び出しで、これを確認できます (違いは 2 行目から始まります)。

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 [com.mycompany.myproject.dto.patrimoine.mobile.ligne.LigneMobile@18949ad1] as "application/json;charset=UTF-8" using [org.springframework.http.converter.json.MappingJacksonHttpMessageConverter@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 が発生します。

4

4 に答える 4

1

あなたは、Accept Headers には が含まれていると言いますapplication/json。許可されたコンテンツ タイプを指定せずにリクエストを送信して調査を開始します。特定のコンテンツ タイプに制約されていない場合、サーバーの応答に関連する手がかりがあるはずです。通常、Web サーバーは、リクエストの処理中にエラーが発生した場合、HTML 形式のエラー ページを返す傾向があります。このような場合、コンテンツ タイプはもちろん text/html であるため、実際の問題は 406 エラーによって難読化されます。

于 2013-06-20T07:37:03.657 に答える
1

まず、 Fiddlerのようなものを起動して、実際にどのビットがネットワーク上を移動しているかを確認します。

于 2013-06-14T19:28:48.390 に答える
0

サーバーを再起動した後にのみこのエラーが表示されることを考えると、これはおそらくクラスの遅延ロードに関連していると思います。

サーバーの起動時に初期化する (つまり、load-on-startup値 1 で) サーブレットを使用してみてください。これは、そのメソッドで、json へinitのレンダリングに関与するすべてのクラスを参照しますか?com.mycompany.myproject.dto.datagrid.LoadResult

関連するすべてのクラスが、リクエストが来る前に ClassLoader によってロードされるようにしようとしていることを思い出してください。

于 2013-06-20T06:23:38.453 に答える