Est-il possible d'avoir un Jackson personnalisé deserializer avec les non-constructeur par défaut?
Permet de dire que j'ai les classes suivantes:
public class Person {
String name;
Set<Department> departments;
}
public class Department {
String code;
String name;
}
Si je veux écrire un personnalisé du Département deserializer afin d'annoter le deparments de terrain en la Personne de la classe à utiliser. Parce que cette coutume deserializer ne sera utilisée que pour désérialiser Département des objets qui sont à l'intérieur d'un objet Personne. Le problème est que ma personnalisé Département deserializer aurez besoin d'avoir un DepartmentRepository qui doit être passé dans les deserializer du constructeur. Comment puis-je faire cela? Est-ce possible? Je ne veux pas enregistrer le deserializer dans l'objet mappeur, car il doit être utilisé uniquement lorsque le deparatments champ à partir de la classe de Personne obtient désérialisé.
Mise à JOUR: Ce dont j'ai besoin, en plus d'annoter les départements de terrain avec JsonDeserialize annotation avec le paramètre contentUsing = MyCustomDepartmentDeserializer.class, est une façon de dire Jackson que lorsqu'il crée un MyCustomDepartmentDeserializer objet, il doit le faire en appelant un constructeur qui reçoit un DepartmentRepository. Le deserializer peut être quelque chose comme ceci:
public class MyCustomDepartmentDeserializer extends JsonDeserializer<Department> {
private final DepartmentRepository departmentRepository;
public MyCustomDepartmentDeserializer(DepartmentRepository departmentRepository) {
this.departmentRepository = departmentRepository;
}
@Override
public Department deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
//IMPLEMENTATION!
}
}
Vous devez vous connecter pour publier un commentaire.
Tout d'abord: pour spécifier deserializer à utiliser pour le contenu d'un tableau vous pouvez utiliser
pour spécifier deserializer à utiliser pour le contenu de la collection en question.
Comme la capacité à utiliser des constructeurs par défaut, @JsonCreator le permet.
Mais passer un contexte objet, vous devez Jackson 1.9 peuvent être votre ami (voir "Jackson 1.9 aperçu"), qui permet "d'injection" des objets à l'extérieur du JSON.
Ensuite, vous pouvez mélanger et assortir injectable valeurs et JSON propriétés, par exemple:
Cela pourrait être assez pour faire ce que vous demandez.
Vous pouvez ajouter un sérialiseur/deserializer avec un non-constructeur par défaut en l'inscrivant comme un module avec vous
ObjectMapper
.Vous devez également supprimer les annotations dans la
MyObject
classe si il y est.Ici est un deserializer je viens d'écrire. Remarque l'utilisation d'un constructeur par défaut.
Utilisé avec le suivant. Notez que vous pouviez avoir n'importe quel constructeur modèle que vous aimez lors de la création de la deserializer et les ajouter dans le module.
Pas, au tout début, vous pouvez aller sans spécifier une coutume deserializer; Jackson peut détecter votre champ imbriqué et la carte correctement, uniquement lorsque toutes les classes du modèle implémente
Serializable
.Ajoutez
implements Serializable
àDepartment
etPerson
, et vous verrez Jackson fonctionne hors de la boîte.Juste à côté de ma tête, je suis sûr que vous pouvez le faire en utilisant les annotations Jackson pour identifier les propriétés que vous voulez l'exposition.