Ne pouvez pas trouver un (Map) - Clé deserializer de type [type simple, classe com.comcast.ivr.de base.domaine.AutoHandlingSlotKey]
J'ai un objet de domaine qui dispose d'une Carte:
private Map<AutoHandlingSlotKey, LinkedHashSet<AutoFunction>> autoHandling;
Quand je sérialiser l'objet, j'obtiens ceci:
"autoHandling" : [ "java.util.HashMap", {
} ],
Cette Carte de clé est un Objet personnalisé:
public class AutoHandlingSlotKey implements Serializable {
private FunctionalArea slot; //ENUM
private String returnView; //ENUM
Donc, je ne suis pas sûr de savoir comment corriger ce problème, je reçois quand je désérialiser l'objet:
org.codehaus.jackson.map.JsonMappingException: Can not find a (Map) Key deserializer for type [simple type, class com.comcast.ivr.core.domain.AutoHandlingSlotKey]
Quelqu'un peut-il m'aider à comprendre comment faire pour corriger ce problème si je ne PAS avoir accès à l'objet du domaine à modifier?
- Concernant 2.9 et, potentiellement, d'autres versions: je comprends de la question github.com/FasterXML/jackson-databind/issues/1419 comme
Map
de sérialisation avec annoté propriétés tout simplement ne fonctionne pas et Jackson échoue avec un autre message d'erreur.
Vous devez vous connecter pour publier un commentaire.
Par défaut, Jackson essaie de sérialiser Java Cartes sous forme d'Objets JSON (paires clé/valeur), de sorte que la Carte clé de l'objet doit être sérialisé en quelque sorte comme une Chaîne de caractères; et il doit y avoir correspondance (et enregistré) clé deserializer. Configuration par défaut prend en charge uniquement un petit ensemble de JDK types (Chaîne de caractères, des nombres, des enum).
Afin de mapper n'a aucune idée de la manière de prendre une Corde et de créer AutoHandlingSlotKey hors de lui.
(en fait, je suis surpris que le sérialiseur n'a pas échoué pour la même raison)
Deux façons évidentes à résoudre sont les suivantes:
Dans votre cas, il est probablement plus facile de faire de l'ancien. Vous pouvez également mettre en œuvre d'une clé personnalisée sérialiseur, pour assurer les touches sont sérialiseur dans le format approprié.
La façon la plus simple de s'inscrire sérialiseurs et deserializers est par Module d'interface qui a été ajouté à Jackson 1.7 (et de 1,8 à soutenir les sérialiseurs/deserializers).
@JsonCreator
. Cela permettra d'éliminer le besoin d'écrire et d'enregistrer une clé personnalisée deserializer.@JsonValue
devrait fonctionner, bien que je n'ai pas testé cela; il y a quelques lacunes dans le soutien pour les annotations avec la clé (de)sérialiseurs. En dehors de cela, une clé personnalisée sérialiseur est une option, soit à l'échelle mondiale s'inscrire ou en utilisant@JsonSerialize(keyUsing=MyKeySerializer.class
pour la classe ou de la propriété.Cela a été demandé il y a longtemps, et c'est le premier résultat google lors de la recherche de l'erreur, mais l'on a accepté la réponse n'a pas de code et pourrait être source de confusion pour un jackson débutant (moi). J'ai finalement trouvé cette réponse qui m'ont aidé.
Ainsi, comme l'affirme accepté de répondre, la mise en Œuvre et l'enregistrement d'une "clé deserializer" est le chemin à parcourir. Vous pouvez le faire comme ceci.
Et pour la classe, tout ce que vous avez à faire est de:
Que c'est! Aucune annotation sur les classes, pas des deserializer pour les cartes, etc.