在投影中删除Spring数据休息自我链接模板

时间:2018-04-05 19:09:50

标签: spring-boot spring-data spring-data-jpa spring-data-rest

{
  "_embedded" : {
    "patient" : {
      "firstName" : "Kidus",
      "_links" : {
        "self" : {
          "href" : "http://localhost:8090/api/patients/2{?projection}",
          "templated" : true
        },
    }
}

正如您所见,我有一个嵌入式实体(患者)。它返回包含实体链接的所有数据,但链接是模板化的。我没有使用前端HATEOAS客户端,我也不打算改变它的路线。所以我需要一个普通的非模板化链接。是否有任何非黑客的方法来实现这一目标?

2 个答案:

答案 0 :(得分:0)

您可以通过以下方式强制扩展模板:

@GetMapping("/myresources/{id}")
public EntityModel<MyResource> myResource(String id) {

    MyResource resource = ...;
    return new EntityModel<>(
                  resource,
                  linkTo(methodOn(getClass()).myResource(id)).withSelfRel().expand(id));
}

答案 1 :(得分:0)

您可以使用自定义 RepresentationModelProcessor 修改 self 链接:

@Component
public class MyProjectionProcessor implements RepresentationModelProcessor<EntityModel<MyProjection>> {

    private static final Pattern TEMPLATE_PATTERN = Pattern.compile("\\{\\?.*");

    @Override
    public EntityModel<MyProjection> process(final EntityModel<MyProjection> model) {
        // copy the model without links
        final EntityModel<MyProjection> newModel = EntityModel.of(model.getContent());
        // loop over links
        for (final Link link : model.getLinks()) {
            Link newLink = link;
            // replace self link if it is templated
            if (link.hasRel(IanaLinkRelations.SELF) && link.isTemplated()) {
                final String href = TEMPLATE_PATTERN.matcher(link.getHref()).replaceFirst("");
                newLink = Link.of(href, IanaLinkRelations.SELF);
            }
            newModel.add(newLink);
        }
        return newModel;
    }

}