Pour faire court, une de mes entités a une GeometryCollection qui lève une exception lorsque vous appelez "getBoundary" (le pourquoi de ceci est un autre livre, pour l'instant disons que c'est ainsi que cela fonctionne).
Y a-t-il un moyen de dire à Jackson de ne pas inclure ce getter spécifique? Je sais que je peux utiliser @JacksonIgnore lorsque je possède / contrôle le code. Mais ce n'est pas le cas, jackson finit par atteindre ce point grâce à la sérialisation continue des objets parents. J'ai vu une option de filtrage dans la documentation de jackson. Est-ce une solution plausible?
Merci!
objectMapper.addMixInAnnotations(Class<?> target, Class<?> mixinSource);
Une autre possibilité est que, si vous souhaitez ignorer toutes les propriétés inconnues, vous pouvez configurer le mappeur comme suit:
la source
mapper.configure(DeserializationFeature.failOnUnknownPropertiesExcep(new String[] {"myField"}));
without()
comme dans:mapper.reader().without(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
Utilisation de la classe Java
Utilisation de l'annotation
la source
L'approche basée sur les annotations est meilleure. Mais parfois, une opération manuelle est nécessaire. Pour cela, vous pouvez utiliser sans méthode ObjectWriter .
la source
Les annotations de mixage fonctionnent assez bien ici, comme déjà mentionné. Une autre possibilité au-delà de @JsonIgnore par propriété est d'utiliser @JsonIgnoreType si vous avez un type qui ne devrait jamais être inclus (c'est-à-dire si toutes les instances des propriétés GeometryCollection doivent être ignorées). Vous pouvez alors soit l'ajouter directement (si vous contrôlez le type), soit en utilisant un mix-in, comme:
Cela peut être plus pratique si vous avez beaucoup de classes qui ont toutes un seul accesseur 'IgnoredType getContext ()' (ce qui est le cas pour de nombreux frameworks)
la source
J'ai eu un problème similaire, mais il était lié aux relations bidirectionnelles d'Hibernate. Je voulais montrer un côté de la relation et ignorer l'autre par programmation, en fonction du point de vue auquel je traitais. Si vous ne pouvez pas faire cela, vous vous retrouvez avec des méchants
StackOverflowException
. Par exemple, si j'avais ces objetsJe voudrais ignorer par programme le
parent
champ de B si je regardais A, et ignorer lechildren
champ de A si je regardais B.J'ai commencé par utiliser des mixins pour faire cela, mais cela devient très vite horrible; vous avez tellement de classes inutiles qui existent uniquement pour formater des données. J'ai fini par écrire mon propre sérialiseur pour gérer cela de manière plus propre: https://github.com/monitorjbl/json-view .
Il vous permet de spécifier par programme les champs à ignorer:
Il vous permet également de spécifier facilement des vues très simplifiées via des correspondances génériques:
Dans mon cas d'origine, le besoin de vues simples comme celle-ci était de montrer le strict minimum sur le parent / enfant, mais cela est également devenu utile pour notre sécurité basée sur les rôles. Vues moins privilégiées des objets nécessaires pour renvoyer moins d'informations sur l'objet.
Tout cela provient du sérialiseur, mais j'utilisais Spring MVC dans mon application. Pour lui permettre de gérer correctement ces cas, j'ai écrit une intégration que vous pouvez ajouter aux classes de contrôleurs Spring existantes:
Les deux sont disponibles sur Maven Central. J'espère que cela aide quelqu'un d'autre, c'est un problème particulièrement laid avec Jackson qui n'avait pas de bonne solution pour mon cas.
la source
Match.match()
?Si vous souhaitez TOUJOURS exclure certaines propriétés pour n'importe quelle classe, vous pouvez utiliser la
setMixInResolver
méthode:la source
Un autre bon point ici est d'utiliser
@JsonFilter
. Quelques détails ici http://wiki.fasterxml.com/JacksonFeatureJsonFilterla source