【问题标题】:Displaying Relation Links for @RestResource(exported = false)显示 @RestResource(exported = false) 的关系链接
【发布时间】:2017-07-06 05:49:17
【问题描述】:

我在 Spring Boot 中使用 Spring Data Rest,但情况有些奇怪。

  • 我们需要我们的客户能够在一个 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;
}
}

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

【问题讨论】:

  • 一些代码会有所帮助——尤其是投影和处理器——也许还有实体
  • @MathiasDpunkt 更新了我的问题

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


【解决方案1】:

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

我假设您没有此子资源的自定义控制器?!如果你不这样做 spring-data-rest 在这种情况下不会暴露子资源 - 因为关系的目标不是exported

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

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

【讨论】:

  • 我试一试,我先试试控制器方案
猜你喜欢
  • 2013-12-29
  • 1970-01-01
  • 1970-01-01
  • 2020-03-08
  • 1970-01-01
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
相关资源
最近更新 更多