Spring Data Rest and excerpt Projections

时间:2015-09-11 00:22:04

标签: spring rest

我正在使用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 /评论时,我看到每个评论都嵌入了订单。

2 个答案:

答案 0 :(得分:1)

我与spring-data-rest 2.5.6有类似的问题。所以我想补充一下。

如果

  • a实体与B实体的关系@OneToMany
  • B实体的存储库@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;
 }
}