Comment désactiver fail_on_empty_beans dans Jackson?


99

À l'aide de jackson 2.1, comment désactiver le fail_on_empty beansque le message d'erreur semble vouloir que je désactive?

Je suppose que c'est juste la chose la plus simple au monde, mais bon sang, il est tard et je n'ai pas été en mesure de trouver un tutoriel simple ou quelque chose de particulièrement évident dans le api. SerializationFactory? Pourquoi le rendraient-ils si peu intuitif et rendraient le message d'erreur si simple?

Bien que je fais comme le message d'erreur, je veux dire, il vaut mieux qu'un NPE.

Je suppose qu'il existe un moyen de le faire en utilisant des annotations - mais je ne suis pas du tout enclin à les utiliser pour le travail simpliste que je fais!

Réponses:


124

Vous pouvez le faire par classe ou globalement, je crois.

Pour par classe, essayez @JsonSerialize ci-dessus la déclaration de classe.

Pour un mappeur, voici un exemple:

ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
// do various things, perhaps:
String someJsonString = mapper.writeValueAsString(someClassInstance);
SomeClass someClassInstance = mapper.readValue(someJsonString, SomeClass.class)

Le lien StackOverflow ci-dessous contient également un exemple de projet Spring.

Pour REST avec Jersey, je ne me souviens pas de ma tête, mais je crois que c'est similaire.


Couple de liens que j'ai déterré: (premier lien édité en raison de l'arrêt de Codehaus).


J'ai utilisé celui-ci plus tôt dans la journée, j'ai quelques informations supplémentaires, par exemple la découverte automatique. stackoverflow.com/questions/4362104/…
Pancakeo

1
Pouvez-vous donner un exemple sur la façon d'utiliser @JsonSerializepour désactiver la FAIL_ON_EMPTY_BEANSdéclaration de classe?
tuk

2
Cela fait quelques années :). Cela pourrait aider: stackoverflow.com/questions/12162413/…
Pancakeo

Ou vous pouvez utiliser la méthode de désactivation de la classe ObjectMapper comme "mapper.disable (SerializationFeature.FAIL_ON_EMPTY_BEANS)"
Reddeiah Pidugu

43

Si vous utilisez Spring Boot, vous pouvez définir la propriété suivante dans le fichier application.properties. spring.jackson.serialization.FAIL_ON_EMPTY_BEANS = false


22

Vous pouvez également obtenir le même problème si votre classe ne contient aucune méthode / propriété publique. J'ai normalement des DTO dédiés aux requêtes et réponses d'API, déclarés publics, mais j'ai oublié dans un cas de rendre les méthodes également publiques - ce qui a provoqué le bean "vide" en premier lieu.


13

Vous pouvez aussi probablement annoter la classe avec @JsonIgnoreProperties(ignoreUnknown=true)pour ignorer les champs non définis dans la classe


1
Cela ne fonctionnera pas si le bean entier est réellement nul
maryoush

12

Si vous souhaitez obtenir un objet JSON sans aucun champ supplémentaire - veuillez ajouter cette annotation à votre classe, cela a parfaitement fonctionné pour moi.

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})

Vous pouvez également ajouter cette ligne dans votre fichier application.properties, mais cela ajoutera un champ supplémentaire à votre JSON.

spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false

J'essayais de renvoyer JSON depuis l'un de mes contrôleurs dans mon application REST à démarrage à ressort et cela corrige le problème pour moi.
ninjasense

Le moyen idéal si vous avez un objet vide!
Georgi Peev

3

Si vous utilisez org.codehaus.jackson.map.ObjectMapper, alors pls. utilisez les lignes suivantes

mapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);

2

Dans Jersey Rest Services, utilisez simplement l'annotation JacksonFeatures ...

@JacksonFeatures(serializationDisable = {SerializationFeature.FAIL_ON_EMPTY_BEANS})
public Response getSomething() {
    Object entity = doSomething();
    return Response.ok(entity).build();
}

1

Dans mon cas, j'ai manqué d'écrire l'annotation @JsonProperty dans l'un des champs qui causait cette erreur.


1

Ajout d'une solution ici pour un problème différent, mais qui se manifeste avec la même erreur ... Faites attention lors de la construction de json à la volée (en tant que réponses API ou autre) pour éviter les guillemets doubles littéraux dans vos membres de chaîne. Vous consommez peut-être votre propre json malformé.


1

Pour résoudre ce problème, configurez votre classe JsonDataFormat comme ci-dessous

ObjectMapper mapper = new ObjectMapper();
mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);

ce qui est presque équivalent à,

mapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);

0
ObjectMapper mapper = new ObjectMapper();

Salut,

Quand j'utilise mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)

Mes valeurs d'objet json viennent `` vides dans la page angulaire signifie en réponse

Résolu à l'aide des paramètres ci-dessous uniquement

mapper.setVisibility(mapper.getSerializationConfig().getDefaultVisibilityChecker().
withFieldVisibility(JsonAutoDetect.Visibility.ANY).withGetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withCreatorVisibility(JsonAutoDetect.Visibility.NONE));

0

Dans mon cas, je n'avais pas besoin de le désactiver, je devais plutôt mettre ce code au-dessus de ma classe: (et cela a résolu mon problème)

    @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)//this is what was added
    @Value //this was there already
    @Builder//this was there already

public class NameOfClass {
     //some code in here.
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.