Je reçois 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 classe MyPackage.TestA et pas de propriétés découvert pour créer BeanSerializer (pour éviter les exceptions, désactivez SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS))
Vous trouverez ci-dessous la classe simple et le code à sérialiser.
Quelqu'un peut-il dire pourquoi je reçois 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();
}
Comme cela a déjà été décrit, la configuration par défaut d'une instance ObjectMapper
consiste à accéder uniquement aux propriétés qui sont des champs publics ou à 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 variable VisibilityChecker
sous-jacente) une règle de visibilité de propriété différente. Jackson 1.9 fournit la méthode de commodité ObjectMapper.setVisibility()
pour le faire. Pour l'exemple de la question initiale, je configurerais probablement ceci en tant que
myObjectMapper.setVisibility(JsonMethod.FIELD, Visibility.ANY);
Pour plus d'informations et de détails sur les options de configuration associées, je vous recommande de consulter les JavaDocs sur ObjectMapper.setVisibility()
.
Pour que Jackson puisse sérialiser cette classe, le champ SomeString
doit être soit public
(actuellement c'est l'isolation au niveau du paquet) ou vous devez définir des méthodes getter et setter pour celle-ci.
J'ai le même problème dans mon code source. Je viens d'ajouter
getter
et
setter
le problème 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 les erreurs sur les beans 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 disable fail_on_empty_beans
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 à ma classe enfant dont l'objet devait être sérialisé.
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
Cette erreur est également générée si vous oubliez d'ajouter la méthode .build () à votre statut de retour.
return Response.status(Status.OK); // fails
return Response.status(Status.OK).build(); // works
J'ai eu 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, d'habitude j'ajoute simplement l'annotation
import com.fasterxml.jackson.annotation.JsonIgnore;
@JsonIgnore
NonSerializeableClass obj;
Pour les applications Oracle Java, ajoutez ceci après l’instanciation ObjectMapper
:
mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
Le problème peut être dû au fait que vous avez déclaré variable en tant que private
. Si vous le changez en public
, cela fonctionne.
La meilleure option consiste à utiliser les méthodes getter et setter.
Cela résoudra le problème!
Voici les trois options:
public
public
, ajoutez getters & setters @JsonIgnore("context")
J'ai trouvé au moins trois façons de le faire:
public getters
sur votre entité que vous essayez de sérialiser;public getters
. Cela changera la valeur par défaut pour Jackson de Visbility=DEFAULT
à @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
où tous les modificateurs d'accès sont acceptés;ObjectMapper
globalement en définissant objectMapperInstance.setVisibility(JsonMethod.FIELD, Visibility.ANY);
. Ceci devrait être évité si vous n'avez pas besoin de cette fonctionnalité globalement.Choisissez en fonction de vos besoins.
J'ai eu un problème similaire avec le chargement différé via l'objet proxy hibernate. Pour contourner le problème, annotez à la classe les propriétés privées chargées paresseuses avec
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
Bien que j'ajoute des accesseurs et des setters, j'obtiens la même erreur. Plus tard, j’ai trouvé un bug, c’est sur les conseils de Sonar que j’ai classé les getters et les setters comme protégés, ce qui était à l’origine du problème. Une fois, j'ai corrigé que cela fonctionnait comme prévu.
SpringBoot2.0 , Je le résous en suivant le code:
@Bean public ObjectMapper objectMapper() {
return new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);}