Serializing with Jackson (JSON) - obtenir "No serializer found"?
j'obtiens une exception quand j'essaie de sérialiser un objet très simple en utilisant Jackson. L'erreur:
org.codehaus.Jackson.cartographie.JsonMappingException: aucun serializer trouvé pour classe MyPackage.TestA et pas de propriétés découvert pour créer BeanSerializer (pour éviter l'exception, désactiver SerializationConfig.Caractéristique.FAIL_ON_EMPTY_BEANS))
ci-dessous est la classe simple et le code à sérialiser.
Quelqu'un peut-il me dire pourquoi j'ai eu 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();
}
14 réponses
comme déjà décrit, la configuration par défaut d'une instance ObjectMapper
est de n'accéder qu'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 (à la VisibilityChecker
sous-jacente ) une règle de visibilité de propriété différente. Jackson 1.9 fournit la méthode pratique ObjectMapper.setVisibility()
pour ce faire. Pour l'exemple de la question originale, je dirais configurez ceci comme
myObjectMapper.setVisibility(JsonMethod.FIELD, Visibility.ANY);
pour plus d'information et de détails sur les options de configuration connexes, je recommande d'examiner les JavaDocs sur ObjectMapper.setVisibility()
.
pour que Jackson sérialise cette classe, le champ SomeString
doit être public
(en ce moment c'est l'isolation au niveau du paquet) ou vous devez définir les méthodes getter et setter pour cela.
j'ai le même problème dans mon code source. Je viens d'ajouter
getter
et
setter
le problème est résolu.
le problème dans mon cas était que Jackson essayait de sérialiser un objet vide sans attributs ni méthodes.
comme suggéré dans l'exception j'ai ajouté la ligne suivante pour éviter l'échec sur les haricots vides:
Pour Jackson 1.9
myObjectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);
Pour Jackson 2.X
myObjectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
Vous pouvez trouver un exemple simple sur jackson désactiver fail_on_empty_beans
cette erreur est également lancée si vous oubliez d'ajouter le .méthode build () sur votre statut de retour.
return Response.status(Status.OK); // fails
return Response.status(Status.OK).build(); // works
j'ai obtenu l'erreur suivante sans la méthode build ():
org.codehaus.jackson.map.JsonMappingException: No serializer found for class com.sun.jersey.core.spi.factory.ResponseBuilderImpl
si vous pouvez éditer la classe contenant cet objet, je n'ai qu'à ajouter l'annotation
import com.fasterxml.jackson.annotation.JsonIgnore;
@JsonIgnore
NonSerializeableClass obj;
j'ai eu le même problème pour une classe d'enfant où j'avais le contrôle, objet mapper était dans un module commun et était inaccessible. Je l'ai résolu en ajoutant cette annotation pour ma classe d'enfant dont l'objet devait être sérialisé.
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
pour les applications Java D'Oracle, ajouter ceci après ObjectMapper
instanciation:
mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
le problème peut être dû au fait que vous avez déclaré la variable private
.
Si vous le changez en public
, ça marche.
Meilleure option est d'utiliser les méthodes getter et setter.
cela résoudra le problème!
j'ai eu un problème similaire avec le chargement paresseux via l'objet proxy hibernate. A contourné en annotant la classe ayant paresseux chargé propriétés privées avec:
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
Voici les trois options:
- données / classe qui ont été consultées doit être
public
- si non
public
, ajouter getters & setters - ou ajouter
@JsonIgnore("context")
bien que j'ai ajouté getters et setters j'ai eu la même erreur. Plus tard j'ai trouvé un bug, c'est-à-dire par le Conseil de Sonar j'ai cgahnged les getters et les setters comme protégé qui causait le problème. Une fois que j'ai réglé ça, ça a fonctionné comme prévu.
j'ai trouvé au moins trois façons de faire ceci:
- Ajouter
public getters
sur votre entité que vous essayez de sérialiser; - Ajouter une annotation en haut de l'entité, si vous ne voulez pas
public getters
. Cela changera la valeur par défaut pour Jackson deVisbility=DEFAULT
à@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
où tous les modificateurs d'accès sont acceptés; - changez votre
ObjectMapper
globalement en mettantobjectMapperInstance.setVisibility(JsonMethod.FIELD, Visibility.ANY);
. Ceci doit être évité si vous n'avez pas besoin de cette fonctionnalité à l'échelle mondiale.
choisissez en fonction de vos besoins.
SpringBoot2.0 code: 151920920"
@Bean public ObjectMapper objectMapper() {
return new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);}