Désérialiseur JSON personnalisé Spring @RestController
Je veux utiliser JSON personnalisé deserializer pour certaines classes(Rôle ici), mais je ne peux pas le faire fonctionner. La coutume deserializer n'est tout simplement pas appelé.
- Je utiliser le Printemps de Démarrage 1.2.
Deserializer:
public class ModelDeserializer extends JsonDeserializer<Role> {
@Override
public Role deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
return null; //this is what should be called but it isn't
}
}
Contrôleur:
@RestController
public class RoleController {
@RequestMapping(value = "/role", method = RequestMethod.POST)
public Object createRole(Role role) {
//... this is called
}
}
@JsonDeserialize
sur le Rôle@JsonDeserialize(using = ModelDeserializer.class) public class Role extends Model { }
Jackson2ObjectMapperBuilder
haricot de Java Config@Bean public Jackson2ObjectMapperBuilder jacksonBuilder() { Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); builder.deserializerByType(Role.class, new ModelDeserializer()); return builder; }
Ce que je fais mal?
MODIFIER Il est probablement causée par @RestController
car il fonctionne avec @Controller
...
source d'informationauteur jakub.petr | 2014-12-18
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, vous n'avez pas besoin de remplacer
Jackson2ObjectMapperBuilder
d'ajouter des deserializer. Cette approche doit être utilisée lorsque vous ne pouvez pas ajouter de@JsonDeserialize
annotation. Vous devez utiliser@JsonDeserialize
ou remplacerJackson2ObjectMapperBuilder
.Ce qui est manqué est le
@RequestBody
annotation:Il y a aussi un autre très intéressant solution qui peut être utile dans le cas où vous souhaitez modifier votre JSON corps avant d'appeler par défaut deserializer. Et imaginons que vous avez besoin d'utiliser quelques autres haricots (utiliser
@Autowire
mécanisme)Laisser l'image de la situation, que vous avez le contrôleur suivant:
Où
OrderProductInterface
est:Le code ci-dessus va fournir des dynamiques de la désérialisation de base sur déposés
providerType
et de validation en fonction de la mise en œuvre concrète. Pour mieux comprendre, considérer queOrderProductForARequestData
peut être quelque chose comme ça:Et de laisser l'image maintenant que nous voulons init en quelque sorte
providerType
(enrichir d'entrée) avant la défaillance de la désérialisation sera exécuté. de sorte l'objet sera désérialisé correctement selon la règle dansOrderProductInterface
.Pour cela, vous pouvez simplement modifier votre
@Configuration
classe de la manière suivante: