Spring MVC アプリケーションで現在見られることについて少し混乱しています。誰かが私たちが間違っていることを教えてくれることを願っています。グーグルは私に答えを持っていないので、私たちは間違っていると確信しています.
シンプルな Spring 4.1.5.RELEASE アプリケーションがあります。それについて特に言及することは何もありません。Jackson ObjectMapper を介して RESTControllers のクライアントに JSON を配信するように構成された MappingJackson2HttpMessageConverter があります。
jackson を介してシリアル化されるすべてのエンティティには、tpe レベルで次の注釈があります。
@JsonIdentityInfo(generator = IntSequenceGenerator.class, property = "@jsonObjectId")
今奇妙な部分:
以下を行う春の統合テストがあります(objectMapperはWebアプリケーションコンテキストから自動配線されます。リクエストペイロードを変換するのは同じインスタンスです)
objectMapper.writeValueAsString(dummy) // generate json from dummy object
mockMvc.perform(post(...)) // make a post request with JSON payload generated
evaluate reponse
テストは1回実行すればOKです。そのテスト ケースをコピーして 2 回実行すると、サーバーから IllegalArgumentExecption -> Already had POJO for id という 400 が返されます。問題は実際のアプリケーションで再現できるため、テストの問題ではないようです。
シリアル化プロセスでは、オブジェクトをシリアル化する必要があるたびに、「jsonObjectId」プロパティの生成を担当する IntSequenceGenerator が作成されることがわかりました。わかりました。しかし、対応する対応物、私たちの場合、デフォルトで使用される jackson の SimpleObjectIdResolver は常に同じインスタンスです。したがって、2 番目のサーバー要求 (2 番目の逆シリアル化プロセス) によって、SimpleObjectIdResolver でその例外が発生します。
私たちが間違っていること、誰かが私にヒントを与えることができれば、私は非常に感謝しています...