Введение

Имея дело с крупномасштабными приложениями, мы часто оказываемся в ситуации, когда нам необходимо предоставлять разные представления объекта разным пользователям или службам в зависимости от привилегий доступа или конкретных требований. Однако достижение этого вручную может быть громоздким и подверженным ошибкам. К счастью, Spring MVC, модуль Spring Framework для создания веб-приложений, предоставляет отличную функцию — аннотацию @JsonView.

Аннотация @JsonView помогает определить поля для сериализации/десериализации для конкретного сценария, что упрощает и упрощает управление тем, как ваше приложение обрабатывает данные для разных пользователей или служб. В этом посте вы узнаете, как эффективно использовать @JsonView в Spring MVC.

Что такое @JsonView?

@JsonView — это аннотация Джексона, используемая в Spring MVC для управления определенными полями объекта JSON в процессе сериализации и десериализации. Эта аннотация может позволить, например, возвращать только определенные поля объекта в зависимости от контекста.

Реализация @JsonView

Допустим, у нас есть класс User в нашем приложении Spring MVC, который мы хотим отображать по-разному в зависимости от ролей пользователей.

public class User {
    private String username;
    private String password;
    private String email;
    // getters and setters
}

Здесь мы можем захотеть отобразить username и email для всех, но password должен быть виден только самому пользователю. Для этого мы можем определить два представления.

public class Views {
    public static class Public {}
    public static class Internal extends Public {}
}

Здесь Public — это представление, которое можно использовать для полей, видимых всем, а Internal — это расширенное представление, включающее поля, видимые только самому пользователю.

Теперь мы можем использовать @JsonView для назначения этих представлений полям в классе User.

public class User {
    
    @JsonView(Views.Public.class)
    private String username;
    
    @JsonView(Views.Internal.class)
    private String password;
    
    @JsonView(Views.Public.class)
    private String email;
    // getters and setters
}

Как видите, username и email имеют вид Public, а password — вид Internal.

Затем в контроллере нам нужно указать представление, которое будет использоваться при возврате пользовательского объекта. Предположим, что мы хотим вернуть общедоступное представление при получении всех пользователей, но при получении определенного пользователя мы хотим вернуть внутреннее представление.

@RestController
public class UserController {
    // Assume userService is already injected

    @JsonView(Views.Public.class)
    @GetMapping("/users")
    public List<User> getAllUsers() {
        return userService.getAllUsers();
    }

    @JsonView(Views.Internal.class)
    @GetMapping("/users/{id}")
    public User getUser(@PathVariable String id) {
        return userService.getUser(id);
    }
}

Аннотация @JsonView для каждого метода указывает, какое представление использовать при возврате объекта User.

Вот и все! Теперь, всякий раз, когда вы извлекаете всех пользователей, вы получите только username и email. Однако при получении определенного пользователя вы получите username, email и password.

Соображения и ограничения

Хотя @JsonView — мощный инструмент, следует помнить о нескольких вещах.

  1. @JsonView не обрабатывает фильтрацию на уровне сохраняемости, а только на уровне представления. Это означает, что это не снижает нагрузку на вашу базу данных; все объекты извлекаются из базы данных, но только некоторые части сериализуются и отправляются клиенту.
  2. @JsonView по умолчанию не применяется к подобъектам. Если у вас есть вложенные объекты и вы хотите применить к ним @JsonView, вам нужно вручную добавить аннотацию @JsonView к каждому полю подобъекта.

Несмотря на эти ограничения, @JsonView — это эффективный и простой способ управления сериализацией и десериализацией ваших объектов в различных контекстах.

Заключение

@JsonView — бесценный инструмент в наборе инструментов Spring MVC, предлагающий разработчикам чистый и эффективный способ управления данными, предоставляемыми различным пользователям или службам. Несмотря на некоторые ограничения, простота использования и предлагаемая гибкость делают его важной частью набора инструментов любого разработчика Spring MVC. Обязательно учтите это в следующий раз, когда будете работать над проектом Spring MVC!

  1. Официальная документация Spring
  2. Baeldung — аннотация Джексона Json View
  3. Руководства по весне

Понравилось читать? Еще не являетесь участником Medium? Вы можете поддержать мою работу напрямую, зарегистрировавшись по моей реферальной ссылке здесь. Это быстро, просто и не требует дополнительных затрат. Спасибо за вашу поддержку!