J'obtiens une exception lorsque j'essaie de sérialiser un objet très simple à l'aide de Jackson. L'erreur:
org.codehaus.jackson.map.JsonMappingException: aucun sérialiseur trouvé pour la classe MyPackage.TestA et aucune propriété découverte pour créer BeanSerializer (pour éviter les exceptions, désactivez SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS))
Vous trouverez ci-dessous la classe et le code simples à sérialiser.
Quelqu'un peut-il me dire pourquoi j'obtiens cette erreur?
public class TestA {
String SomeString = "asd";
}
TestA testA = new TestA();
ObjectMapper om = new ObjectMapper();
try {
String testAString = om.writeValueAsString(testA); // error here!
TestA newTestA = om.readValue(testAString, TestA.class);
} catch (JsonGenerationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JsonMappingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Réponses:
Comme déjà décrit, la configuration par défaut d'une
ObjectMapper
instance consiste à accéder uniquement aux propriétés qui sont des champs publics ou qui ont des getters / setters publics. Une alternative à la modification de la définition de classe pour rendre un champ public ou pour fournir un getter / setter public est de spécifier (au sous-jacentVisibilityChecker
) une règle de visibilité de propriété différente. Jackson 1.9 fournit laObjectMapper.setVisibility()
méthode pratique pour le faire. Pour l'exemple de la question d'origine, je configurerais probablement ceci commePour Jackson> 2.0:
Pour plus d'informations et de détails sur les options de configuration associées, je recommande de consulter les JavaDocs sur
ObjectMapper.setVisibility()
.la source
myObjectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
{"term":{"call_failed":"true"}}
il génère la structure yaml comme:filter: map: term: map: call_failed: "true"
Pourquoi il génère desmap
mots clés? Comment puis-je le supprimer?@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
au-dessus de votre classePour que Jackson sérialise cette classe, le
SomeString
champ doit êtrepublic
(en ce moment c'est l'isolement au niveau du package) ou vous devez définir des méthodes getter et setter pour cela.la source
J'ai le même problème dans mon code source. Je viens d'ajouter
et
le problème résolu.
la source
Le problème dans mon cas était que Jackson essayait de sérialiser un objet vide sans attribut ni méthode.
Comme suggéré dans l'exception, j'ai ajouté la ligne suivante pour éviter l'échec sur les beans vides:
Pour Jackson 1.9
Pour Jackson 2.X
Vous pouvez trouver un exemple simple sur jackson disable fail_on_empty_beans
la source
J'ai eu le même problème pour une classe enfant où j'avais le contrôle, le mappeur d'objets était dans un module commun et était inaccessible. Je l'ai résolu en ajoutant cette annotation pour ma classe enfant dont l'objet devait être sérialisé.
la source
Si vous pouvez modifier la classe contenant cet objet, j'ajoute généralement juste l'annotation
la source
org.codehaus.jackson.annotate.JsonIgnore
Cette erreur est également levée si vous oubliez d'ajouter la méthode .build () à votre état de retour.
J'ai eu l'erreur suivante sans la méthode build ():
la source
SpringBoot2.0 , Je le résous par le code suivant:
la source
Pour les applications Oracle Java, ajoutez ceci après l'
ObjectMapper
instanciation:la source
J'ai eu un problème similaire avec le chargement paresseux via l'objet proxy de mise en veille prolongée. Contourné en annotant la classe ayant des propriétés privées chargées paresseusement avec:
la source
Le problème peut être dû au fait que vous avez déclaré la variable en tant que
private
. Si vous le changez enpublic
, cela fonctionne.La meilleure option est d'utiliser des méthodes getter et setter pour cela.
Cela résoudra le problème!
la source
J'ai trouvé au moins trois façons de procéder:
public getters
votre entité que vous essayez de sérialiser;public getters
. Cela va changer la valeur par défaut pour Jackson à partirVisbility=DEFAULT
de@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
laquelle tous les modificateurs d'accès sont acceptés;ObjectMapper
monde en définissantobjectMapperInstance.setVisibility(JsonMethod.FIELD, Visibility.ANY);
. Cela devrait être évité si vous n'avez pas besoin de cette fonctionnalité à l'échelle mondiale.Choisissez en fonction de vos besoins.
la source
Voici les trois options:
public
public
, ajoutez des getters et setters@JsonIgnore("context")
la source
Veuillez utiliser ceci au niveau de la classe pour le bean:
la source
l'ajout de setter et getter résoudra également le problème tel qu'il a été résolu pour moi. Pour Ex:
la source
Je n'ai eu que des getters, après avoir ajouté des setters aussi, les problèmes ont été résolus.
la source
Bien que j'aie ajouté des getters et des setters, j'obtenais la même erreur. Plus tard, j'ai trouvé un bug, c'est sur les conseils de Sonar que j'ai qualifié les getters et les setters de protégés, ce qui causait le problème. Une fois que j'ai corrigé cela fonctionnait comme prévu.
la source
dans la botte de printemps 2.2.5
après avoir ajouté getter et setter
j'ai ajouté @JsonIgnore au sommet du champ.
la source