web-dev-qa-db-fra.com

Qu'est-ce que la classe JSON View à Jackson et comment fonctionne-t-elle?

Je ne comprends pas ce qu'est @JsonView de Jackson (Views.MyClass.class). Je sais que je peux annoter les champs et les méthodes de POJO de cette manière pour filtrer ceux qui ne sont pas annotés d'être sérialisés avec JSON. Mais qu'est-ce que la classe Views.Myclass? Est-ce une classe de modèle pour la bibliothèque Jackson?

Et pourquoi peut-il y avoir de nombreuses classes à l'intérieur de la classe Views? Par exemple, comme ceci:

 class Views {
            static class Public { }
            static class ExtendedPublic extends PublicView { }
            static class Internal extends ExtendedPublicView { }
  }

Pourquoi est-il nécessaire et comment fonctionne-t-il?

15
IngeniousTom

Utilisation @JsonView pour filtrer les champs en fonction du contexte de sérialisation. Lorsque vous renvoyez des données à un client REST, selon le service REST appelé), nous devons limiter les données qui seront sérialisées tout en utilisant le même modèle de données.

Disons que nous voulons créer deux services REST:

Le premier service renvoie certaines informations utilisateur comme le prénom et le nom, mais pas les messages qui y sont joints.

Le deuxième service renvoie toutes les informations du premier service ainsi que les messages joints à l'utilisateur actuel.

Exemples de classes POJO avec @JsonView annotation

Classes utilisateur Pojo

@JsonView(User.Views.Public.class)
    public String getFirstname() {
        return firstname;
    }

 @JsonView(User.Views.Public.class)
    public String getLastname() {
        return lastname;
    }

Message Pojo class

@JsonView(User.Views.Internal.class)
    public List<Message> getMessages() {
        return messages;
    }

Contrôleur de repos

@RestController
public class SimpleRestController {

    @Autowired
    SimpleService simpleService;

    @RequestMapping(value = "/user/public", method = RequestMethod.GET)
    @JsonView(User.Views.Public.class)
    public User getUserWithPublicData() {
        return simpleService.loadUser();
    }


    @RequestMapping(value = "/user/internal", method = RequestMethod.GET)
    @JsonView(User.Views.Internal.class)
    public User getUserWithInternalData() {
        return simpleService.loadUser();
    }
}
38
Gangadhar