显示@RestResource(exported = false) 的关系链接
Displaying Relation Links for @RestResource(exported = false)
我正在使用 Spring Data Rest 和 Spring 启动,我遇到了一些奇怪的情况。
我们需要我们的客户能够 post 一个资源及其在一个 JSON 对象中的所有关系,所以我们将关系设为 @RestResource( exported = false)
,这是我们能找到的唯一解决方案,问题是我们失去了 links
我们现在正在尝试创建此资源的投影,其所有关系显示为 links
到目前为止我们尝试的是创建一个投影,其中添加了 getXXX()
的非关系属性,然后使用 ResourceProcessor
来处理 links,如 ,但我们似乎无法让它工作
问:这是解决这个问题的最佳方法吗?我们如何像普通资源一样将 links 添加到投影中?
更新
所以这是我的投影 class
@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;
}
}
但这不起作用,这只是将 link 添加到 /rates 作为资源而不是子资源
EntityLinks 不知道您要生成的子资源 link - 因此您获得默认的顶级 link。
我假设您没有此子资源的自定义控制器?!如果你不这样做 spring-data-rest 在这种情况下将不会公开子资源 - 因为关系的目标不是 exported
.
在这种情况下,您需要一个自定义控制器来公开此子资源。如果你走这条路,你应该使用 ControllerLinkBuilder
来构建这个 link。如果你想坚持使用 EntityLinks
,你可以执行以下操作(对于 link,你需要 id - 要获得它,它需要在投影上可用):
fullSPResource.add(entityLinks.linkForSingleResource(SP.class, fullSPResource.getContent().getId()).slash("rates").withRel("rates"));
我正在使用 Spring Data Rest 和 Spring 启动,我遇到了一些奇怪的情况。
我们需要我们的客户能够 post 一个资源及其在一个 JSON 对象中的所有关系,所以我们将关系设为
@RestResource( exported = false)
,这是我们能找到的唯一解决方案,问题是我们失去了 links我们现在正在尝试创建此资源的投影,其所有关系显示为 links
到目前为止我们尝试的是创建一个投影,其中添加了 getXXX()
的非关系属性,然后使用 ResourceProcessor
来处理 links,如
问:这是解决这个问题的最佳方法吗?我们如何像普通资源一样将 links 添加到投影中?
更新 所以这是我的投影 class
@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;
}
}
但这不起作用,这只是将 link 添加到 /rates 作为资源而不是子资源
EntityLinks 不知道您要生成的子资源 link - 因此您获得默认的顶级 link。
我假设您没有此子资源的自定义控制器?!如果你不这样做 spring-data-rest 在这种情况下将不会公开子资源 - 因为关系的目标不是 exported
.
在这种情况下,您需要一个自定义控制器来公开此子资源。如果你走这条路,你应该使用 ControllerLinkBuilder
来构建这个 link。如果你想坚持使用 EntityLinks
,你可以执行以下操作(对于 link,你需要 id - 要获得它,它需要在投影上可用):
fullSPResource.add(entityLinks.linkForSingleResource(SP.class, fullSPResource.getContent().getId()).slash("rates").withRel("rates"));