Java – Json (com.fasterxml.jackson) InvalidDefinitionException

Veröffentlicht von

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)