Jackson Json 并且没有这样的方法错误 [英] Jackson Json and no such method errors

查看:27
本文介绍了Jackson Json 并且没有这样的方法错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 jackson 来序列化和反序列化 POJO.从 POJO 到 JSON 可以完美运行,但反过来不行.

I am trying to use jackson to serialize and deserialize a POJO. Going from POJO to JSON works perfectly but going the other direction does not.

我有一个 POJO

public class Event {
  private String kind;

  public String getKind() {
    return kind;
  }

  public void setKind(String kind) {
    this.kind = kind;
  }
}

为了运行和测试我运行包 calendar.model;

and to run and test I run package 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);

抛出异常

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)

我已经尽我所能让 JSON 到 POJO 工作,但它不会.如果我从 JSON 映射到 Map 类型,它确实有效.

I have played with about all I can to get the JSON to POJO to work but it won't. It does work if I map from JSON to a Map type.

感谢您的帮助

这是我的依赖项中 jackson 的 grep

here is a grep for jackson in my dependencies

± > 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

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

It looks like there is no other version of jackson except for jackson2.

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

The full method being run is a spring controller method.

@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;
  }

推荐答案

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

It looks like the problem is that you are getting incompatible versions of jackson-core and jackson-databind - jackson-core 2.0.5 is being pulled in, but I believe at least 2.1.0 is required.

异常的第一行告诉你它找不到方法JsonParser.getValueAsString(),查看2.0.5,该方法确实不存在.看起来它是在 2.1.0.

The first line of the exception tells you that it can't find the method JsonParser.getValueAsString(), looking at the API docs for 2.0.5, that method indeed does not exist. It looks like it was added in 2.1.0.

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

So, you'll need to fix the dependencies - most likely by excluding 2.0.5 and including 2.1.0.

这篇关于Jackson Json 并且没有这样的方法错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆