Така че искате 2 неща:
1) отървете се от полето _links
2) включете свързаното поле sector
Възможно решение (работи за мен :D)
1) отървете се от _links
За това създайте класа по-долу:
[... package declaration, imports ...]
public class MyRepositoryRestMvcConfiguration extends RepositoryRestMvcConfiguration {
public MyRepositoryRestMvcConfiguration(ApplicationContext context, ObjectFactory<ConversionService> conversionService) {
super(context, conversionService);
}
@Bean
protected LinkCollector linkCollector() {
return new LinkCollector(persistentEntities(), selfLinkProvider(), associationLinks()) {
public Links getLinksFor(Object object, List<Link> existingLinks) {
return new Links();
}
};
}
}
и го използвайте напр.:
[... package declaration, imports ...]
@SpringBootApplication
@Import({MyRepositoryRestMvcConfiguration.class})
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
Доста съм сигурен (99%, но не е тествано), че няма да имате нужда от този клас за премахване на _links
за свързания обект/съекти, включени по начина, по който се показва следващата точка (2).
2) включете свързаното поле sector
За това можете да използвате Извадки (специално направени за този сценарий). Тъй като примерът на Spring е толкова красноречив и е глупаво просто да го копирате тук, просто ще го посоча: https://docs.spring.io/spring-data/rest/docs/3.1.x/reference/html/#projections-excerpts.excerpting-commonly-accessed-data.
Но само за протокола и за ваше удобство ще поставя основните части на пролетния пример:
@Projection(name = "inlineAddress", types = { Person.class })
interface InlineAddress {
String getFirstName();
String getLastName();
Address getAddress();
}
вижте на Javadoc за проекция, който types
означава Типът, към който е обвързан типът за проекция.
Извадката може да се използва по следния начин:
@RepositoryRestResource(excerptProjection = InlineAddress.class)
interface PersonRepository extends CrudRepository<Person, Long> {}
за да получите това (когато използвате и MyRepositoryRestMvcConfiguration):
{
"firstName" : "Frodo",
"lastName" : "Baggins",
"address" : {
"street": "Bag End",
"state": "The Shire",
"country": "Middle Earth"
}
}
За вас sector
е еквивалент на address
.
Последни бележки
При връщане на масиви полето _links
няма да бъде премахнато (твърде натрапчиво е да го правите); накрая ще имате нещо подобно:
{
"_embedded" : {
"persons" : [ {person1}, {person2}, ..., {personN} ]
},
"_links" : {
e.g. first, next, last, self, profile
},
"page" : {
"size" : 1,
"totalElements" : 10,
"totalPages" : 10,
"number" : 0
}
}
Както можете да видите, дори и да премахнем _links
, това пак няма да е достатъчно; някой вероятно би искал _embedded
да бъде заменен от persons
, което би довело до по-малко поддържаем код (твърде много пролетни натрапчиви отмени). Но ако някой наистина иска и тези, трябва да започне да проверява RepositoryRestMvcConfiguration
и RepositoryEntityController.getCollectionResource
.
Пролетта се развива, така че чувствам необходимостта да отбележа, че това работи най-малко с:
spring-data-rest-webmvc 3.1.3.RELEASE
или, ако предпочитате пролетна версия за зареждане:
spring-boot-starter-parent 2.1.1.RELEASE
person
adrhc
schedule
12.12.2018