显示@RestResource的关系链接(exported = false)

时间:2017-07-06 05:49:17

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

我使用Spring Data Rest和Spring启动,我有点奇怪的情况。

  • 我们需要我们的客户能够在一个JSON对象中发布一个具有所有关系的资源,因此我们将关系设为@RestResource( exported = false),这是我们能找到的唯一解决方案,我们失去了链接

  • 我们现在正尝试创建此资源的投影,其所有关系显示为链接

我们到目前为止尝试的是创建一个投影,其中非关系属性添加了getXXX(),然后使用ResourceProcessor来处理this question中的链接,但我们不能似乎让它工作

问:这是解决这个问题的最好方法吗?我们如何添加像普通资源这样的投影链接?

更新 所以这是我的投影课

@Projection(name = "fullSP", types = {SP.class})
public interface FullSP {}

这是我的处理器

@Component
public class FullSPResourceProcessor implements ResourceProcessor<Resource<FullSP>> {

private final EntityLinks entityLinks;

@Autowired
public FullSPResourceProcessor(EntityLinks entityLinks) {
    this.entityLinks = entityLinks;
}

@Override
public Resource<FullSP> process(Resource<FullSP> fullSPResource) {
    FullSP fullSP= fullSPResource.getId();
    fullSPResource.add(entityLinks.linkFor(Rate.class).withRel("rates"));
    return fullSPResource;
}
}

但这不起作用,这只是添加/ rate作为资源而不是作为子资源的链接

1 个答案:

答案 0 :(得分:0)

EntityLinks不了解您要生成的子资源链接 - 因此您将获得默认的顶级链接。

我假设你没有这个子资源的自定义控制器?!如果你没有弹簧 - 数据休息在这种情况下不会暴露子资源 - 因为关系的目标不是exported

在这种情况下,您需要一个自定义控制器来公开此子资源。如果你走这条路线,你应该使用ControllerLinkBuilder建立这个链接。如果您想坚持EntityLinks,您可以执行以下操作(对于您需要id的链接 - 要获得它,它需要在投影上可用):

fullSPResource.add(entityLinks.linkForSingleResource(SP.class, fullSPResource.getContent().getId()).slash("rates").withRel("rates"));