Сериализация DTO объекта. Json

191
26 апреля 2018, 11:36

Есть класс Building.

Building{
Long Id; 
String name; 
Integer countRooms; 
}

И есть класс Room

Room{
Long Id; 
String name; 
Building building; 
}

Когда я делаю запрос /buildings?id=1 Выводится JSON как мне и нужно.

{
"id": 1, 
"name":name,  
"counRooms": 1
}

А когда делаю запрос /rooms?id=1 Выводится JSON

{
"id":1, 
"name": name, 
"buiding":{
"id": 1, 
"name":name,  
"countRooms": 1
}

Но мне в этом ответе поле countRooms не нужно. Пробовал JsonIgnore но тогда это поле не выводится в первом случае . Помогите разобраться. Буду благодарен.

Answer 1

Вашу задачу можно решить при помощи аннотации Jackson @JsonView. Эта аннотация позволяет включать или исключать поля объекта, попадающие в сериализованный объект, в зависимости от условия - активного view. Возьмём, например, вот такой код:

// Класс, содержащий интерфейсы, которыми мы будем обозначать наши view
public class Views {
    public interface Public {}
    public interface Private extends Public {};
}
// При активном Views.Public включаются все поля...
@JsonView(Views.Public.class)
public class Bean {
    private long id;
    private String name;
    // ... кроме поля secret. Поле secret включится при активном Views.Private.
    // Так как Views.Private - наследник Views.Public, то при активном Views.Private
    // будет также активен и Views.Public, а значит, будут включены и поля, включённые
    // при активном Views.Public
    @JsonView(Views.Private.class)
    private String secret;
    // constructor, getters, setters
}

Теперь укажем контроллеру, какой view использовать для сериализации:

@RestController
public class Controller {
    // В ответе будут поля id и name
    @JsonView(Views.Public.class)
    public Bean getPublic() {
        return new Bean(1, "name", "secret");
    }
    // В ответе будут поля id, name и secret
    @JsonView(Views.Private.class)
    public Bean getPrivate() {
        return new Bean(1, "name", "secret");
    }
}

Применительно к вашей задаче, вам нужно будет создать два view - RoomView и BuildingView (наследник RoomView). RoomView нужно навесить на классы Room и Building, а BuildingView - на поле Building.countRooms. Также нужно навесить RoomView на контроллер /rooms и BuildingView на контроллер /buildings. После этого /buildings будет возвращать JSON с полем countRooms, а /rooms - без него.

Подробнее про JSON Views в Jackson можно почитать здесь или здесь.

READ ALSO
Управление панелью навигации

Управление панелью навигации

Скрыл программно статус-бар и нижнюю панель навигацииНо при свайпе снизу вверх в нижней части экрана навигационная панель выезжает

197
Как на java подменить код библиотеки?

Как на java подменить код библиотеки?

Есть библиотека которая использует HashMap из стандартной библиотекиКак можно сделать так, чтобы она использовала мой HashMap? Код библиотеки трогать...

189
Не создается бинарное дерево

Не создается бинарное дерево

В строке присвоения значения rootdata возникает ошибка NullPointerExeption, не могу понять почему

238