JsonMappingException重复属性...用于[simple type,class java.lang.Exception]

时间:2014-11-14 20:24:57

标签: java json jackson

我正在尝试将有效的json字符串映射到POJO,其代码大约​​在2周前发布。 我在这两周内没有对代码进行任何更改。

根据http://jsonformatter.curiousconcept.com/,我的json字符串有效。

我正在使用Jackson将json映射到POJO:

response = new ObjectMapper().readValue(validJsonString, response.class);

之前有效!现在我收到以下错误。任何见解将不胜感激。我找不到与此错误消息有关的任何内容(在stacktrace的标题和第一行中)。

org.codehaus.jackson.map.JsonMappingException: Duplicate property 'cause' for [simple type, class java.lang.Exception]
at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCache2(StdDeserializerProvider.java:267)
at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCacheValueDeserializer(StdDeserializerProvider.java:242)
at org.codehaus.jackson.map.deser.StdDeserializerProvider.findValueDeserializer(StdDeserializerProvider.java:111)
at org.codehaus.jackson.map.deser.BasicDeserializerFactory.createCollectionDeserializer(BasicDeserializerFactory.java:178)
at org.codehaus.jackson.map.deser.StdDeserializerProvider._createDeserializer(StdDeserializerProvider.java:330)
at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCache2(StdDeserializerProvider.java:262)
at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCacheValueDeserializer(StdDeserializerProvider.java:242)
at org.codehaus.jackson.map.deser.StdDeserializerProvider.findValueDeserializer(StdDeserializerProvider.java:111)
at org.codehaus.jackson.map.deser.StdDeserializer.findDeserializer(StdDeserializer.java:307)
at org.codehaus.jackson.map.deser.BeanDeserializer.resolve(BeanDeserializer.java:246)
at org.codehaus.jackson.map.deser.StdDeserializerProvider._resolveDeserializer(StdDeserializerProvider.java:346)
at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCache2(StdDeserializerProvider.java:301)
at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCacheValueDeserializer(StdDeserializerProvider.java:242)
at org.codehaus.jackson.map.deser.StdDeserializerProvider.findValueDeserializer(StdDeserializerProvider.java:111)
at org.codehaus.jackson.map.deser.StdDeserializerProvider.findTypedValueDeserializer(StdDeserializerProvider.java:127)
at org.codehaus.jackson.map.ObjectMapper._findRootDeserializer(ObjectMapper.java:1655)
at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:1588)
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1116)
at com.jpmorgan.wm.svc.client.coverage.WmSvcLogAnalytics.getMosaicTraceIdStatus(WmSvcLogAnalytics.java:178)
at com.jpmorgan.wm.svc.client.coverage.WmSvcLogAnalytics.getLogAnalyticsLogEventDetails(WmSvcLogAnalytics.java:118)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
at java.lang.reflect.Method.invoke(Method.java:611)
at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:168)
at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:70)
at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:279)
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:136)
at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:86)
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:136)
at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:74)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1357)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1289)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1239)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1229)
at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:420)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:497)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:684)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1661)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:944)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:507)
at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:181)
at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:91)
at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:878)
at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1592)
at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:191)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:453)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:515)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:306)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:277)
at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.sendToDiscriminators(NewConnectionInitialReadCallback.java:214)
at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.complete(NewConnectionInitialReadCallback.java:113)
at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:175)
at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
at com.ibm.io.async.AsyncChannelFuture$1.run(AsyncChannelFuture.java:205)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1660)
Caused by: 
java.lang.IllegalArgumentException: Duplicate property 'cause' for [simple type, class java.lang.Exception]
at org.codehaus.jackson.map.deser.BeanDeserializer.addProperty(BeanDeserializer.java:187)
at org.codehaus.jackson.map.deser.BeanDeserializerFactory.buildThrowableDeserializer(BeanDeserializerFactory.java:164)
at org.codehaus.jackson.map.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:95)
at org.codehaus.jackson.map.deser.StdDeserializerProvider._createDeserializer(StdDeserializerProvider.java:340)
at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCache2(StdDeserializerProvider.java:262)
... 56 more

3 个答案:

答案 0 :(得分:1)

我自己遇到了这个问题,并且发现我的JsonProperty注释中有重复的名称。在我的例子中,导致错误的bean引用了一个单独的类,其中存在实际的拼写错误:

@JsonProperty("attributes") Object attributes,
@JsonProperty("attributes") BoundingBox boundingBox,
...

重新检查并修复所有构造函数后,我开始工作了。

底线:检查你的构造函数!

答案 1 :(得分:0)

我猜你确实有些事情发生了变化;根据我的经验,它可能是JSK的升级 - Exception的定义确实在JDK 1.6和1.7之间发生了变化。

但至于解决问题,请确保您使用的是最新版本的Jackson。从类名,看起来您使用的是Jackson 1.x(而非2.x),因此您选择的版本可能会受到限制。但至少要确保使用最新版本的次要版本(例如,如果您使用的是1.9.4,请使用最新的1.9版本,1.9.13)。 这个特殊问题可能已在以后的补丁版本中得到修复。

答案 2 :(得分:0)

这不能完全按照书面回答问题,但却是我问题的最终解决方案。

我重构了我的代码,最终导致代码减少。

我不再将JSON映射到java对象。在检查了我的代码之后,我意识到我对java对象进行了很少的处理,之后它被重新切换回JSON并从Jersey REST服务发送到前端。

所以我现在只是直接将JSON字符串作为string而不是由Jersey串行化为JSON的java对象返回。

话虽如此,我仍然不知道实际问题是什么。我仍然乐于听取别人对异常的看法。但就目前而言,我有更好的解决方案。