首页 文章

Spring Data REST(SDR):公开Repository或JaxRS以进行链接构建

提问于
浏览
2

我是SDR和Spring HATEOAS工具的初学者 .

As per Spring Neo4j Rest Doc

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中有两个类可用于构建链接,例如:
ControllerLinkBuilderJaxRsLinkBuilder

如果我们通过Spring入门指南完成了大部分内容,它会显示Controller的示例 . 据我所知,两者都有两个不同的名称,即分别与Controller和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"));

通过其中任何一个(即 ControllerLinkBuilderJaxRsLinkBuilder ),它总是抛出异常:

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肯定有问题..

我的问题是:

  • 如何创建定位到Controller或JAX-RS服务甚至是Exposed Repository的链接(使用Spring Data REST或Spring HATEOAS)!! ?

  • 如果获取请求中有多种类型的JSON数据,并且需要大量链接,我们是否需要在临时基础上创建链接,或者是否有办法自动生成链接?

  • 将Repository暴露为REST服务是否存在任何安全问题?

谢谢 !!

1 回答

  • 0

    好吧,我想在某种程度上我找到了我的问题的答案:

    • 关于 java.lang.IllegalStateException 我在我的web.xml中遗失了Listner:
    <listener>
        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>
    
    • SDR和Spring HATEOAS都是两个不同的舞者,SDR与HATEOAS共舞,但HATEOAS可以独奏舞蹈 . SDR基本上将我们的Spring Data驱动存储库作为REST服务公开,可以根据我们的存储库设计及其扩展的其他存储库(如 GraphRepositoryPagingAndSortingRepository 等)用作自我探索机器 .

    • 据我所知,Spring HATEOAS是Link构建机器,它使用我们的REST服务或Controller类来构建给定资源的链接 . 例如

    Entity obj = repository.findByName(name);
    Resource<Entity> resource = new Resource<Entity>(obj);
    resource.add(JaxRsLinkBuilder.linkTo(TestResource.class).withRel("entity"));
    return resource;
    

    我认为这是为每个必需的实体bean手动创建链接和关系的唯一方法,在SDR的情况下,这是自动控制的 .

    • 为了验证或安全,我发现link很有用 . 但仍在尝试实施它 .

    我希望这对某人有帮助..如果可能的话,请随时更新或更正我的答案 . 谢谢

相关问题