杰克逊杰森并没有这样的方法错误

aus*_*nbv 39 java json jackson deserialization

我正在尝试使用jackson序列化和反序列化POJO.从POJO到JSON的工作非常完美,但是朝另一个方向发展却并非如此.

我有一个POJO

public class Event {
  private String kind;

  public String getKind() {
    return kind;
  }

  public void setKind(String kind) {
    this.kind = kind;
  }
}
Run Code Online (Sandbox Code Playgroud)

并运行和测试我运行包calendar.model;

Event event = new Event();
event.setKind("This is a kind");
String json = objectMapper.writeValueAsString(event); 
// RETURNS: "{\"kind\":\"This is a kind\"}"

objectMapper.readValue(json, Event.class);
Run Code Online (Sandbox Code Playgroud)

抛出异常

java.lang.NoSuchMethodError: com.fasterxml.jackson.core.JsonParser.getValueAsString()Ljava/lang/String;
at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:24)
at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:375)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:98)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:308)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2796)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1942)
at calendar.controller.RootController.details(RootController.java:59)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:100)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:604)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:565)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
Run Code Online (Sandbox Code Playgroud)

我已尽其所能地让JSON到POJO工作,但事实并非如此.如果我从JSON映射到Map类型,它确实有效.

谢谢您的帮助

编辑

这是我的依赖项中的杰克逊的grep

± > mvn dependency:tree | grep jackson                                                                                                                       -I- 
[INFO] +- com.google.http-client:google-http-client-jackson2:jar:1.13.1-beta:compile
[INFO] |  \- com.fasterxml.jackson.core:jackson-core:jar:2.0.5:compile
[INFO] |  |  +- com.fasterxml.jackson.core:jackson-annotations:jar:2.1.1:compile
[INFO] |  |  +- com.fasterxml.jackson.dataformat:jackson-dataformat-xml:jar:2.1.1:compile
[INFO] |  |  |  +- com.fasterxml.jackson.core:jackson-databind:jar:2.1.1:compile
[INFO] |  |  |  +- com.fasterxml.jackson.module:jackson-module-jaxb-annotations:jar:2.1.0:compile
Run Code Online (Sandbox Code Playgroud)

除了jackson2之外,看起来没有其他版本的jackson.

正在运行的完整方法是弹簧控制器方法.

@RequestMapping(value = "/")
  public Event root() throws IOException {
    Event event = new Event();
    event.setKind("This is a kind");
    String json = objectMapper.writeValueAsString(event);
    // RETURNS: "{\"kind\":\"This is a kind\"}"

    Event mapped = objectMapper.readValue(json, Event.class);
    return mapped;
  }
Run Code Online (Sandbox Code Playgroud)

Spe*_*esk 63

看起来问题是你得到了不兼容的版本jackson-corejackson-databind- jackson-core 2.0.5正在被引入,但我相信至少需要2.1.0.

异常的第一行告诉您它无法找到方法JsonParser.getValueAsString(),查看2.0.5的API文档,该方法确实不存在.它看起来像是在2.1.0中添加的.

因此,您需要修复依赖项 - 最有可能是排除2.0.5并包括2.1.0.

  • 您可以添加一个声明适当版本的`<dependencyManagement>`部分,而不是排除.比排除更优雅. (8认同)
  • 完美的谢谢你们,最简单的方法是将jackson-core 2.1.1添加为我的pom中的显式依赖项,如果这不是我告诉我的最佳方式. (3认同)
  • @austinbv谢谢你,当我使用最新版本的jackson-core它修复了我的问题:<! - https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core - > <dependency > <groupId> com.fasterxml.jackson.core </ groupId> <artifactId> jackson-core </ artifactId> <version> 2.7.5 </ version> </ dependency> (2认同)