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!

bharal
la source

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).

Pancakeo
la source
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

abhishek jain
la source
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.

RJStanford
la source
13

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

AllDayAmazing
la source
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
user1913615
la source
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);
thangamanikasi
la source
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();
}
méphistophélès78
la source
1

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

Wahib Ul Haq
la source
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é.

Kirk B.
la source
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);
Reddeiah Pidugu
la source
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));
Shahid Hussain Abbasi
la source
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.
}
AppEmmanuel
la source