我正在使用Spring Data Rest文档的inlineAddress示例。
/人按预期内联返回地址。
现在我向AddressRepository添加一个投影
@RepositoryRestResource(excerptProjection = AddressProjection.class)
如下所示
@Projection(name = "AddressesProjection", types = Address.class)
public interface AddressProjection {
public String getStreet();
}
这导致/ person调用将地址投影设为_embedded
{
"_embedded" : {
"persons" : [ {
"firstName" : "dfdf",
"lastName" : "2",
"addresses" : [ {
"street" : "tx",
"state" : "tx",
"country" : "dfd"
} ],
"_embedded" : {
"addresses" : [ {
"street" : "tx",
"_links" : {
"self" : {
"href" : "/api/addresses/1{?projection}",
"templated" : true
}
}
} ]
},
"_links" : {
"self" : {
"href" : " api/persons/1{?projection}",
"templated" : true
},
"addresses" : {
"href" : " /api/persons/1/addresses"
}
}
} ]
}
}
我不知道这是否是预期的。当我有一个像订单/评论这样的oneToMany关系时,这种行为会导致重复信息,并且对订单和评论都进行投影,当我访问订单/ 1 /评论时,我看到每个评论都嵌入了订单。
答案 0 :(得分:1)
我与spring-data-rest 2.5.6
有类似的问题。所以我想补充一下。
如果:
@OneToMany
@RepositoryRestResource
包含excerptProjection 然后 spring-data-rest会将B实体的列表嵌入到任何A实体中(在_embedded中)。
如果没有excerptProjection
,则列表不会被嵌入。
我希望能够选择我想要嵌入的内容,但目前我没有找到解决办法。
答案 1 :(得分:0)
对于正在寻找该问题答案的任何人,我确实确实找到了解决方案。
根据Spring-RestBucks中的示例,您将需要在RepresentationModelProcessor
上使用自定义A entity
。
还要考虑RepresentationModelProcessor
上的官方Spring HATEOAS Documentation。
应用到上面的示例中,您将执行以下操作:
public class PersonRepresentationProcessor implements RepresentationModelProcessor<EntityModel<Person>> {
private final EntityLinks entityLinks;
@Override
public EntityModel<Person> process(EntityModel<Person> personModel) {
// create new EntityModel without the embedded collection
TypedEntityLinks<Person> typedPersonLink = entityLinks.forType(Person::getId);
EntityModel<Person> newPerson = new EntityModel<>(personModel.getContent(),
personModel.getLinks());
// add more links or other modifications
return newPerson;
}
}