删除预测中的 Spring 数据休息自链接模板

Posted

技术标签:

【中文标题】删除预测中的 Spring 数据休息自链接模板【英文标题】:Remove Spring data rest self link templating in projections 【发布时间】:2018-09-15 17:08:01 【问题描述】:

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

如您所见,我有一个嵌入式实体(患者)。它返回所有数据,包括指向实体的链接,但链接是模板化的。我没有使用前端 HATEOAS 客户端,我也不打算改变这方面的路线。所以我需要一个普通的非模板链接。有没有什么简单的方法来实现这一点?

【问题讨论】:

如果您使用 Spring HATEOAS 并在资源类上定义投影,则 self 链接将被模板化。这是 Spring 强制执行的约定,因此没有“非 hacky”方式来改变它(但可能有一种 hacky 方式)。 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

您可以使用自定义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;
    


【讨论】:

以上是关于删除预测中的 Spring 数据休息自链接模板的主要内容,如果未能解决你的问题,请参考以下文章

RestTemplate Module|休息模板模块

Jason中的Spring Data Rest -Disable自我链接(HAL)

Spring Data Rest - 在 Json 中禁用自我链接(HAL)

zabbix主动模式与被动模式添加监控主机添加自定义模板

如何链接到 Shopify 中的自定义模板?

kotlin + Spring boot 中的单元测试休息控制器