Итак, вы хотите 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 развивается, поэтому я чувствую необходимость указать, что это работает, по крайней мере, с:
spring-data-rest-webmvc 3.1.3.RELEASE
или, если вы предпочитаете весеннюю загрузочную версию:
spring-boot-starter-parent 2.1.1.RELEASE
person
adrhc
schedule
12.12.2018