Что такое класс JSON View в Джексоне и как он работает?

Я не понимаю, что такое @JsonView Джексона (Views.MyClass.class). Я знаю, что могу аннотировать поля и методы POJO таким образом, чтобы отфильтровать неаннотированные поля от сериализации с помощью JSON. Но что такое класс Views.Myclass? Это шаблонный класс для библиотеки Джексона?

И почему внутри класса Views может быть много классов? Например, вот так:

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

Зачем это нужно и как это работает?

1 ответ

Решение

Использование @JsonView фильтровать поля в зависимости от контекста сериализации. При возврате данных клиенту REST, в зависимости от того, какая служба REST была вызвана, нам необходимо ограничить сериализацию данных при использовании одной и той же модели данных.

Допустим, мы хотим создать две службы REST:

Первая служба возвращает некоторую информацию о пользователе, такую ​​как имя и фамилия, но не прикрепленные к ней сообщения.

Второй сервис возвращает всю информацию из первого сервиса, а также сообщения, прикрепленные к текущему пользователю.

Примеры классов POJO с @JsonView аннотирование

Пользователь Pojo classs

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

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

Сообщение Pojo класс

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

Контроллер отдыха

@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();
    }
}
Другие вопросы по тегам