我是 SDR 和 Spring HATEOAS 工具的初学者。
Spring Data REST 采用 Spring HATEOAS 和 Spring Data Neo4j 的特性,并自动将它们组合在一起。
我的存储库是:
@RepositoryRestResource(collectionResourceRel = "entity", path = "entity")
public interface MyRepository extends GraphRepository<EntityBean>, RelationshipOperationsRepository<EntityBean>, PagingAndSortingRepository<EntityBean, Long>{}
我可以看到 HATEOAS 中有两个类可用于构建链接,例如:
ControllerLinkBuilder
和JaxRsLinkBuilder
如果我们通过大部分教程,甚至 Spring 入门指南,它显示了控制器的示例。据我所知,两者都代表两个不同的东西,即分别创建与控制器和 JAX-RS 服务的链接。但是,当我尝试在我的 REST 服务中构建链接时:
EntityBean bean = myService.save(bean);
Resource<EntityBean> obj = new Resource<EntityBean>(bean);
obj.add(ControllerLinkBuilder.linkTo(ControllerLinkBuilder.methodOn(TestResource.class).dummy("dummy")).withRel("entity"));
通过它们中的任何一个(即ControllerLinkBuilder
或JaxRsLinkBuilder
)它总是抛出异常:
java.lang.IllegalStateException: Could not find current request via RequestContextHolder
但是当我尝试手动添加它们时:
Link link = new Link("http://localhost:9090/amg-web/sdr/);
obj.add(link);
/amg-web/sdr/
Servlet 映射到哪里RepositoryRestDispatcherServlet
并且它没有任何故障地工作......具有以下输出作为application/hal+json
响应类型:
{
_links: {
entity: {
href: "http://localhost:9090/amg-web/sdr/entity{?page,size,sort}"templated: true
}-
}-
}
所以**LinkBuilder..一定有问题。
我的问题是:
- 如何创建指向控制器或 JAX-RS 服务甚至公开存储库的链接(使用 Spring Data REST 或 Spring HATEOAS)!?
- 如果 fetch 请求中有不止一种类型的 JSON 数据,并且需要很多链接,我们是否需要像上面那样在 ad-hoc 基础上创建链接,或者有没有办法自动生成它?
- 将存储库暴露为 REST 服务是否有任何安全问题?
谢谢 !!