2016-02-05 116 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