2016-02-05 118 views
0

的Spring MVC應用程序,我有點糊塗這些事情我現在看到我們的Spring MVC應用程序,我希望有人能告訴我是什麼,我們正在做錯誤的。由於谷歌沒有對我的答案,我相信我們做錯了。奇怪的行爲與@JsonIdentityInfo

我們已經一個簡單的Spring應用4.1.5.RELEASE。沒有什麼特別的提及它。有一個MappingJackson2HttpMessageConverter配置爲通過Jackson ObjectMapper向RestControllers中的客戶端傳遞JSON。

其中獲得通過傑克遜連載所有實體對TPE級

@JsonIdentityInfo(generator = IntSequenceGenerator.class, property = "@jsonObjectId") 

現在奇怪的部分如下註解:

有彈簧集成測試,執行以下操作(objectMapper被從自動裝配web應用上下文中,其將請求paylod相同的實例)

objectMapper.writeValueAsString(dummy) // generate json from dummy object 
mockMvc.perform(post(...)) // make a post request with JSON payload generated 
evaluate reponse 

執行測試一次爲鄰凱。如果我複製該測試用例並執行兩次,那麼我會從服務器返回一個400,返回IllegalArgumentExecption - >已經有POJO用於​​ID ...問題可以在現實應用程序中複製,因此它似乎沒有測試問題。

我已經想通了,在序列化過程中,負責生成「jsonObjectId」屬性的IntSequenceGenerator每次需要序列化一個對象時都會被創建。好吧到目前爲止。但是相應的對應,在我們的例子中,來自Jackson的默認使用的SimpleObjectIdResolver始終是相同的實例。因此,第二個服務器請求(第二個反序列化過程)導致SimpleObjectIdResolver中出現該異常。

,我會很感激,如果有人可以給我一個提示,我們正在做什麼錯......

回答

0

忘了提:傑克遜核心2.4.1使用。我們現在升級到傑克遜版本2.7.0,現在每個反序列化都會重新創建SimpleObjectIdResolver。這似乎是2.7.0之前傑克遜的一個bug。

編輯:我能對這個問題減少到下面的小測試:

public class DummyTest { 

private Dummy dummy = new Dummy(); 

@Before 
public void setUp() { 
    dummy.setFoo("Foo"); 
} 

@Test 
public void testApp() throws Exception { 
    ObjectMapper mapper = new ObjectMapper(); 
    String dummyAsJsonString = mapper.writeValueAsString(dummy); 

    mapper.readValue(dummyAsJsonString, Dummy.class); 
    mapper.readValue(dummyAsJsonString, Dummy.class); 
} 
} 

其中Dummy.class被定義爲

@JsonIdentityInfo(generator = IntSequenceGenerator.class, property = "@jsonObjectId") 
public class Dummy { 

private String foo; 

public String getFoo() { 
    return foo; 
} 

public void setFoo(String foo) { 
    this.foo = foo; 
} 

} 

與傑克遜在執行時,你會得到一個IllegalStateException 2.4.1

+0

安斯加爾您好,我知道的2.7.0之前的版本有哈希數組和字符串一些bug,你有你的跟蹤誤差? – nole