0

我有一个奇怪的问题,根本没有找到任何关于它的信息。

有一个简单的 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 对象映射器测试序列化/反序列化时,它按预期工作!

ObjectMapper mapper = new ...
mapper.writeValue(stringWriter, bill);
mapper.readValue(stringWriter.toString(), Bill.class);

这完美地工作。所以我猜 POJO 本身没问题,杰克逊能够处理 JSON 字符串。

使用相同的 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 时它可以工作。

任何帮助将不胜感激。

4

1 回答 1

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);
}
于 2013-10-06T10:28:05.493 回答