InvalidDefinitionException is intermediate exception which is used as the base class for all JsonMappingExceptions that occurred due to problems with target type definition. Generally a problem with properties or annotations used on a class.
Example of InvalidDefinitionException
In this given example deserialing String JSON to Student object. Here Student class is not having default constructor that’s causing issue as “No able to construct object as no default constructor found”
public class Student { private int rollNumber; private String firstName; private String lastName; public Student(int rollNumber, String firstName, String lastName) { this.rollNumber=rollNumber; this.firstName=firstName; this.lastName=lastName; } // getter and setter of class }
import java.io.IOException; import com.fasterxml.jackson.databind.ObjectMapper; public class TestJacksonExample { public static void main(String[] args) { String json="{\"rollNumber\":21 , \"firstName\":\"Saurabh\" , \"lastName\":\"Gupta\"}"; try { ObjectMapper mapper = new ObjectMapper(); Student student= mapper.readValue(json, Student.class); System.out.println(student); } catch(IOException ex) { ex.printStackTrace(); } catch(Exception ex) { ex.printStackTrace(); } }
Stacktrace of InvalidDefinitionException
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.fiot.json.jackson.exceptions.Student` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (String)"{"rollNumber":21 , "firstName":"Saurabh" , "lastName":"Gupta"}"; line: 1, column: 2]
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)
at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1452)
at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1028)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1297)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:326)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4013)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3004)
at com.fiot.json.jackson.exceptions.TestJacksonExample.main(TestJacksonExample.java:18)
Solutions
To solution of this issue just add a default constructor as below
public class Student { private int rollNumber; private String firstName; private String lastName; //default constructor public Student() { super(); } public Student(int rollNumber, String firstName, String lastName) { this.rollNumber=rollNumber; this.firstName=firstName; this.lastName=lastName; } // getter and setter of class }
Note:
Jackson looks for POJO class for deserialization. As per definition of POJO (Plain Old Java Object) is the class with out any restriction, having getter and setter methods, if required can also implement object class methods like equals(), toString() etc.
You would like to see
Follow below link to see more JSON issues solutions:
Can you share the required code so that try to help you.
thank it solved my problem
Thanks mate!!
It worked for me thanks.
It worked for me! Thanks
That’s exactly how to do it wrong.
Do you have any reasons to promote bad engineering practices?
Jackson looks for POJO class for deserialization. As per definition of POJO (Plain Old Java Object) is the class with out any restriction, having getter and setter methods, if required can also implement object class methods like equals(), toString() etc.