JsonMappingException: Δεν βρέθηκε κατάλληλος κατασκευαστής για τον τύπο [simple type, class ]: δεν μπορεί να γίνει ενσάρκωση από αντικείμενο JSON

Λαμβάνω το ακόλουθο σφάλμα όταν προσπαθώ να λάβω ένα αίτημα JSON και να το επεξεργαστώ:

org.codehaus.jackson.map.JsonMappingException: ApplesDO]: δεν μπορεί να γίνει ενσάρκωση από αντικείμενο JSON (πρέπει να προστεθούν/ενεργοποιηθούν πληροφορίες τύπου;)

Εδώ είναι το JSON που προσπαθώ να στείλω:

{
  "applesDO" : [
    {
      "apple" : "Green Apple"
    },
    {
      "apple" : "Red Apple"
    }
  ]
}

Στον ελεγκτή, έχω την ακόλουθη υπογραφή μεθόδου:

@RequestMapping("showApples.do")
public String getApples(@RequestBody final AllApplesDO applesRequest){
    // Method Code
}

AllApplesDO είναι ένα περιτύλιγμα του ApplesDO :

public class AllApplesDO {

    private List<ApplesDO> applesDO;

    public List<ApplesDO> getApplesDO() {
        return applesDO;
    }

    public void setApplesDO(List<ApplesDO> applesDO) {
        this.applesDO = applesDO;
    }
}

ApplesDO:

public class ApplesDO {

    private String apple;

    public String getApple() {
        return apple;
    }

    public void setApple(String appl) {
        this.apple = apple;
    }

    public ApplesDO(CustomType custom){
        //constructor Code
    }
}

Νομίζω ότι το Jackson δεν μπορεί να μετατρέψει το JSON σε αντικείμενα Java για υποκλάσεις. Παρακαλώ βοηθήστε με τις παραμέτρους διαμόρφωσης του Jackson για τη μετατροπή του JSON σε αντικείμενα Java. Χρησιμοποιώ το Spring Framework.

EDIT: Συμπεριλήφθηκε το σημαντικό σφάλμα που προκαλεί αυτό το πρόβλημα στο παραπάνω δείγμα κλάσης - Παρακαλώ δείτε την αποδεκτή απάντηση για τη λύση.

Λύση

Έτσι, τελικά συνειδητοποίησα ποιο είναι το πρόβλημα. Δεν είναι θέμα διαμόρφωσης του Jackson, όπως αμφέβαλλα.

Στην πραγματικότητα το πρόβλημα ήταν στην κλάση ApplesDO:

public class ApplesDO {

    private String apple;

    public String getApple() {
        return apple;
    }

    public void setApple(String apple) {
        this.apple = apple;
    }

    public ApplesDO(CustomType custom) {
        //constructor Code
    }
}

Υπήρχε ένας προσαρμοσμένος κατασκευαστής που είχε οριστεί για την κλάση, καθιστώντας τον ως τον προεπιλεγμένο κατασκευαστή. Η εισαγωγή ενός εικονικού κατασκευαστή έκανε το σφάλμα να εξαφανιστεί:

public class ApplesDO {

    private String apple;

    public String getApple() {
        return apple;
    }

    public void setApple(String apple) {
        this.apple = apple;
    }

    public ApplesDO(CustomType custom) {
        //constructor Code
    }

    //Introducing the dummy constructor
    public ApplesDO() {
    }

}
Σχόλια (13)

Αυτό συμβαίνει για τους εξής λόγους:

  1. η εσωτερική σας κλάση θα πρέπει να ορίζεται ως στατική

    private static class Κατάσταση { // ειδικά για το Jackson
    }
  2. Ίσως να μην έχετε προεπιλεγμένο κατασκευαστή στην κλάση σας (ΑΝΑΘΕΩΡΗΣΗ: Φαίνεται να μην ισχύει αυτό).

    private static class Condition {
        private Long id,
    
        public Condition() {
        }
    
        // Setters and Getters
    }
  3. Μπορεί οι Setters σας να μην έχουν οριστεί σωστά ή να μην είναι ορατοί (π.χ. private setter).

Σχόλια (14)

Μπορείτε να δοκιμάσετε αυτή τη δομή. Αν θυμάμαι καλά, μπορείτε να το χρησιμοποιήσετε με αυτόν τον τρόπο:

{
    "applesRequest": {
        "applesDO": [
            {
                "apple": "Green Apple"
            },
            {
                "apple": "Red Apple"
            }
        ]
    }
}

Δεύτερον, παρακαλώ προσθέστε προεπιλεγμένο κατασκευαστή σε κάθε κλάση, μπορεί επίσης να βοηθήσει.

Σχόλια (4)