Наконец, у меня есть ответ после прочтения документации Справочное руководство по REST Spring Data
REST Spring Data представляет представление по умолчанию для модели домена, которую вы экспортируете. но если нам может понадобиться изменить представление этой модели по различным причинам, мы можем использовать проекции и выдержки для обслуживания упрощенных и сокращенных видов ресурсов.
В моем случае первым шагом является создание Prejection Интерфейс моей сущности Меню и выберите все атрибуты, которые я хочу найти в ответе JSON.
@Projection(name = "MenuProjection", types = Menu.class)
public interface MenuProjection {
Long getId();
String getName();
Menu getParent();
List<Menu> getChildrens();
}
Второй шаг - добавить свойство excerptProjection из RepositroyRestRessource аннотация с Menu.Class значением в моем интерфейсе MenuRepository . @RepositoryRestResource(excerptProjection = MenuProjection.class)
JSON Ответ до
{
"_embedded" : {
"menus" : [ {
"name" : "cat_test1",
"_links" : {
"self" : {
"href" : "http://localhost:9292/menus/1"
},
"menu" : {
"href" : "http://localhost:9292/menus/1"
},
"parent" : {
"href" : "http://localhost:9292/menus/1/parent"
},
"pages" : {
"href" : "http://localhost:9292/menus/1/pages"
},
"children" : {
"href" : "http://localhost:9292/menus/1/children"
}
}
}, {
"name" : "cat_test2",
"_links" : {
"self" : {
"href" : "http://localhost:9292/menus/2"
},
"menu" : {
"href" : "http://localhost:9292/menus/2"
},
"parent" : {
"href" : "http://localhost:9292/menus/2/parent"
},
"pages" : {
"href" : "http://localhost:9292/menus/2/pages"
},
"children" : {
"href" : "http://localhost:9292/menus/2/children"
}
}
} ]
},
"_links" : {
"self" : {
"href" : "http://localhost:9292/menus{?page,size,sort}",
"templated" : true
},
"profile" : {
"href" : "http://localhost:9292/profile/menus"
},
"search" : {
"href" : "http://localhost:9292/menus/search"
}
},
"page" : {
"size" : 20,
"totalElements" : 2,
"totalPages" : 1,
"number" : 0
}
}
JSON с проекцией
{
"_embedded" : {
"menus" : [ {
"name" : "cat_test1",
"parent" : null,
"id" : 1,
"childrens" : [ {
"name" : "cat_test2"
} ],
"_links" : {
"self" : {
"href" : "http://localhost:9292/menus/1"
},
"menu" : {
"href" : "http://localhost:9292/menus/1{?projection}",
"templated" : true
},
"childrens" : {
"href" : "http://localhost:9292/menus/1/childrens{?projection}",
"templated" : true
},
"parent" : {
"href" : "http://localhost:9292/menus/1/parent{?projection}",
"templated" : true
},
"pages" : {
"href" : "http://localhost:9292/menus/1/pages"
}
}
}, {
"name" : "cat_test2",
"parent" : {
"name" : "cat_test1",
},
"id" : 2,
"childrens" : [ ],
"_links" : {
"self" : {
"href" : "http://localhost:9292/menus/2"
},
"menu" : {
"href" : "http://localhost:9292/menus/2{?projection}",
"templated" : true
},
"childrens" : {
"href" : "http://localhost:9292/menus/2/childrens{?projection}",
"templated" : true
},
"parent" : {
"href" : "http://localhost:9292/menus/2/parent{?projection}",
"templated" : true
},
"pages" : {
"href" : "http://localhost:9292/menus/2/pages"
}
}
} ]
},
"_links" : {
"self" : {
"href" : "http://localhost:9292/menus{?page,size,sort,projection}",
"templated" : true
},
"profile" : {
"href" : "http://localhost:9292/profile/menus"
},
"search" : {
"href" : "http://localhost:9292/menus/search"
}
},
"page" : {
"size" : 20,
"totalElements" : 2,
"totalPages" : 1,
"number" : 0
}
}
Итак, с помощью Spring Data Projection мы можем включить поля данных в ресурс сущности.