web-dev-qa-db-fra.com

Jackson Json et aucune de ces erreurs de méthode

J'essaie d'utiliser Jackson pour sérialiser et désérialiser un POJO. Aller de POJO à JSON fonctionne à la perfection, mais inversement.

J'ai un POJO

public class Event {
  private String kind;

  public String getKind() {
    return kind;
  }

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

et pour exécuter et tester, je lance le 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);

Lancers Exception

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)

J'ai joué avec à peu près tout pour que le JSON de POJO fonctionne, mais ce ne sera pas le cas. Cela fonctionne si je mappe de JSON à un type de carte.

Merci pour l'aide

MODIFIER

voici un grep pour jackson dans mes dépendances

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

Il semble qu'il n'y ait pas d'autre version de jackson à l'exception de jackson2.

La méthode complète en cours d’exécution est une méthode de contrôleur à ressort.

@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

Il semble que le problème soit que vous obteniez des versions incompatibles de jackson-core Et de jackson-databind - jackson-core 2.0.5 est en cours d'installation, mais je pense qu'au moins la version 2.1.0 est requise.

La première ligne de l'exception vous indique qu'il ne trouve pas la méthode JsonParser.getValueAsString(), en consultant la documentation de l'API pour 2.0.5 , cette méthode n'existe en effet pas. On dirait qu'il a été ajouté dans 2.1. .

Donc, vous aurez besoin de réparer les dépendances - très probablement en excluant les versions 2.0.5 et 2.1.0.

63
Spencer Uresk