480 votes

JsonMappingException: Aucun constructeur approprié trouvé pour le type [type simple, classe]: impossible d'instancier à partir d'un objet JSON

J'obtiens l'erreur suivante en essayant d'obtenir un JSON demande et de la traiter>

org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type [simple type, class com.myweb.ApplesDO]: can not instantiate from JSON object (need to add/enable type information?)

Voici le JSON, je suis en train d'envoyer:

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

Dans le Contrôleur , j'ai la signature de méthode suivante

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

AllApplesDO est un wrapper de 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
            }
}

Je pense que JACKSON est incapable de convertir en JSON dans des objets JAVA pour sublclasses. S'il vous plaît aider avec les paramètres de configuration pour JACKSON à convertir en JSON dans des Objets JAVA! Je suis en utilisant le Framework Spring

EDIT: le bug majeur qui est à l'origine de ce problème dans l'exemple ci-dessus de la classe - s'il vous Plaît regardez accepté de répondre pour la solution.

612voto

Lucky Murari Points 2097

Donc, finalement, j'ai réalisé quel est le problème. Ce n'est pas un problème de configuration Jackson, j'en doutais.

En fait, le problème était dans la classe 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
    }
}
 

Un constructeur personnalisé a été défini pour la classe, ce qui en fait le constructeur par défaut. L'introduction d'un constructeur factice a fait disparaître l'erreur:

 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() {
    }

}
 

394voto

Bludream Points 300

Cela arrive pour les raisons suivantes:

  1. votre classe interne devrait être définie comme statique

     private static class Conditiont {  //jackson specific 
    
     }
     
  2. Il se peut que vous n'ayez pas de constructeur par défaut dans votre classe

     private static class Condition {
        private Long id;
    
        public Condition() {
        }
    
        // Setters and Getters
    }
     
  3. Il se peut que vos Setters ne soient pas définis correctement ou ne soient pas visibles (p. Ex. Setter privé)

10voto

danny.lesnik Points 9526

Pouvez-vous s'il vous plaît tester cette structure. Si je me souviens bien, vous pouvez l'utiliser de cette façon:

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

Deuxièmement, s'il vous plaît ajouter le constructeur par défaut à chaque classe, il pourrait aussi aider.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X