Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Jackson Json and no such method errors

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.

I have a POJO

public class Event {   private String kind;    public String getKind() {     return kind;   }    public void setKind(String kind) {     this.kind = kind;   } } 

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); 

Throws 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) 

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.

Thanks for the help

EDIT

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 

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;   } 
like image 326
austinbv Avatar asked Feb 16 '13 20:02

austinbv


People also ask

How do I ignore unknown properties on Jackson?

Jackson API provides two ways to ignore unknown fields, first at the class level using @JsonIgnoreProperties annotation and second at the ObjectMapper level using configure() method.

Why do we use Jackson in spring boot?

XML support Since 2.0 release, Jackson provides first class support for some other data formats than JSON. Spring Framework and Spring Boot provide builtin support for Jackson based XML serialization/deserialization.

Which constructor does Jackson use?

Jackson uses default (no argument) constructor to create object and then sets value using setters. so you only need @NoArgsConstructor and @Setter.


1 Answers

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.

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.

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

like image 92
Spencer Uresk Avatar answered Sep 27 '22 23:09

Spencer Uresk