所以你想要两件事情:
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
字段
为此,您可以使用Excerpts(专为此场景设计)。 因为Spring的示例非常简洁,只是将其复制到这里是很傻的。 我会直接指向:https://docs.spring.io/spring-data/rest/docs/3.1.x/reference/html/#projections-excerpts.excerpting-commonly-accessed-data。
但仅供记录和方便起见,我将粘贴Spring示例的主要部分:
@Projection(name = "inlineAddress", types = { Person.class })
interface InlineAddress {
String getFirstName();
String getLastName();
Address getAddress();
}
请参阅
Projection 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
,这会导致代码难以维护(过多的Spring侵入式覆盖)。但是,如果确实需要这些,应该开始检查
RepositoryRestMvcConfiguration
和
RepositoryEntityController.getCollectionResource
。
Spring正在不断发展,因此我觉得有必要指出这至少可以与以下版本一起使用:
spring-data-rest-webmvc 3.1.3.RELEASE
或者,如果您更喜欢Spring Boot版本:
spring-boot-starter-parent 2.1.1.RELEASE
@JsonPropertyOrder
应该允许您根据需要自定义内容。 - Oliver Drotbohm