我有一个奇怪的问题,根本没有找到任何关于它的信息。
有一个简单的POJO(简化..)
@XmlRootElement
public class Bill {
List<Position> positions
.. getter/setter
}
@XmlRootElement
public class Position {
.. some simple properties with getters/setters
}
我无法使用这些类的实例调用RESTful服务。我得到了真正奇怪的错误,我真的不明白。
org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.util.List out of START_OBJECT token
有趣的是,当我直接使用Jackson Object mapper测试序列化/反序列化时,它按预期工作!
ObjectMapper mapper = new ...
mapper.writeValue(stringWriter, bill);
mapper.readValue(stringWriter.toString(), Bill.class);
这完美无缺。所以我猜POJO本身就没问题,杰克逊能够处理JSON-String。
使用相同的Bill实例调用RESTful服务失败,并显示上述错误。我看到它也在使用Jackson,这里是堆栈跟踪的一部分:
at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:160)
at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:198)
at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:103)
at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:93)
at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:25)
at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:230)
以下是RESTful应用程序的配置方式:
@javax.ws.rs.ApplicationPath("rest")
public class ApplicationConfig extends Application {
public Set<Class<?>> getClasses() {
return getRestResourceClasses();
}
/**
* Do not modify this method. It is automatically generated by NetBeans REST support.
*/
private Set<Class<?>> getRestResourceClasses() {
Set<Class<?>> resources = new java.util.HashSet<Class<?>>();
resources.add(rest.RestAPI.class);
// following code can be used to customize Jersey 1.x JSON provider:
try {
Class jacksonProvider = Class.forName("org.codehaus.jackson.jaxrs.JacksonJsonProvider");
resources.add(jacksonProvider);
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(getClass().getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
return resources;
}
}
你知道我错过了什么吗? 我使用NetBeans生成了服务和客户端。哦,当我使用XML而不是JSON时,它可以工作。
非常感谢任何帮助。
答案 0 :(得分:0)
对不起,经过几个小时的测试和调试后,我终于找到了问题的原因。 我仍然会非常感兴趣为什么会这样?
注释掉下面的代码就可以了:
// following code can be used to customize Jersey 1.x JSON provider:
try {
Class jacksonProvider = Class.forName("org.codehaus.jackson.jaxrs.JacksonJsonProvider");
resources.add(jacksonProvider);
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(getClass().getName()).log(java.util.logging.Level.SEVERE, null, ex);
}