Есть класс 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 но тогда это поле не выводится в первом случае . Помогите разобраться. Буду благодарен.
Вашу задачу можно решить при помощи аннотации 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 можно почитать здесь или здесь.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости