it-swarm.com.de

Jackson Json und keine derartigen Methodenfehler

Ich versuche, Jackson zu verwenden, um ein POJO zu serialisieren und zu deserialisieren. Das Wechseln von POJO zu JSON funktioniert einwandfrei, das Wechseln in die andere Richtung jedoch nicht.

Ich habe einen POJO

public class Event {
  private String kind;

  public String getKind() {
    return kind;
  }

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

und um zu starten und zu testen, starte ich das Paket 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);

Wirft Ausnahme

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)

Ich habe mit allem gespielt, was ich kann, um den JSON zu POJO zum Laufen zu bringen, aber es wird nicht funktionieren. Es funktioniert, wenn ich JSON einem Kartentyp zuordne.

Danke für die Hilfe

BEARBEITEN

hier ist ein Grep für Jackson in meinen Abhängigkeiten

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

Es sieht so aus, als gäbe es keine andere Version von jackson außer jackson2.

Die vollständige Methode, die ausgeführt wird, ist eine Federkontrollmethode.

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

Es sieht so aus, als ob das Problem darin besteht, dass Sie inkompatible Versionen von jackson-core Und jackson-databind Erhalten - jackson-core 2.0.5 wird eingezogen, aber ich glaube, dass mindestens 2.1.0 erforderlich ist.

In der ersten Zeile der Ausnahme wird angegeben, dass die Methode JsonParser.getValueAsString() nicht gefunden werden kann. In den API-Dokumenten wird nach 2.0.5 gesucht. Diese Methode ist in der Tat nicht vorhanden. Es sieht so aus, als ob es in 2.1. hinzugefügt wurde.

Sie müssen also die Abhängigkeiten korrigieren - höchstwahrscheinlich durch Ausschließen von 2.0.5 und Einschließen von 2.1.0.

63
Spencer Uresk