Ich hatte heute ein kleines Problem mit der „com.fasterxml.jackson“ Library, ich habe imer eine „InvalidDefinitionException“ bekommen und konnte mir nicht erklären wieso.
Fehler
Das ist der Beispiel-Code, der diese „InvalidDefinitionException“ verursacht.
Model
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
}Code-Sprache: JavaScript (javascript)
Demo
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();
}
}Code-Sprache: JavaScript (javascript)
Stacktrace von InvalidDefinitionException
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.fiot.json.jackson.exceptions.Student` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (File); line: 2, column: 3] (through reference chain: java.lang.Object[][0])
at com.fasterxml.jackson.databind@2.13.2.2/com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)
at com.fasterxml.jackson.databind@2.13.2.2/com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1904)
at com.fasterxml.jackson.databind@2.13.2.2/com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:400)
at com.fasterxml.jackson.databind@2.13.2.2/com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1349)
at com.fasterxml.jackson.databind@2.13.2.2/com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1415)
at com.fasterxml.jackson.databind@2.13.2.2/com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:351)
at com.fasterxml.jackson.databind@2.13.2.2/com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:184)
at com.fasterxml.jackson.databind@2.13.2.2/com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:214)
at com.fasterxml.jackson.databind@2.13.2.2/com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:24)
at com.fasterxml.jackson.databind@2.13.2.2/com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:322)
at com.fasterxml.jackson.databind@2.13.2.2/com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4674)
at com.fasterxml.jackson.databind@2.13.2.2/com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3494)Code-Sprache: JavaScript (javascript)
Lösung
Die Lösung war am Ende einfach, ich musste dem Model nur einen weiteren Constructor hinzufügen, der wie folgt aussieht.
public Student() {
super();
}Code-Sprache: JavaScript (javascript)
Hier nochmal das ganze Model mit der Änderung.
public class Student {
private int rollNumber;
private String firstName;
private String lastName;
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
}Code-Sprache: JavaScript (javascript)