【问题标题】:Spring Data REST (SDR): Exposing Repository or JaxRS for Link buildingSpring Data REST (SDR):为链接构建公开存储库或 JaxRS
【发布时间】:2014-05-02 09:55:21
【问题描述】:

我是 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 和 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/ 是映射到RepositoryRestDispatcherServlet 的Servlet,它可以正常工作... 输出为application/hal+json 响应类型:

{
_links: {
    entity: {
        href: "http://localhost:9090/amg-web/sdr/entity{?page,size,sort}"templated: true
    }-
}-
}

所以 **LinkBuilder.. 一定有问题。

我的问题是:

  1. 如何创建指向控制器或 JAX-RS 服务甚至公开存储库的链接(使用 Spring Data REST 或 Spring HATEOAS)!! ?
  2. 如果 fetch 请求中的 JSON 数据类型不止一种,并且需要很多链接,我们是否需要像上面那样在 ad-hoc 基础上创建链接,或者有没有办法自动生成它?
  3. 将存储库暴露为 REST 服务是否存在任何安全问题?

谢谢!!

【问题讨论】:

    标签: spring hateoas spring-data-rest spring-hateoas


    【解决方案1】:

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

    1. 关于 java.lang.IllegalStateException 我在 web.xml 中缺少以下 Listner:

      <listener>
          <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
      </listener>  
      
    2. SDR 和 Spring HATEOAS 都是两个不同的舞者,SDR 和 HATEOAS 一起跳舞,但 HATEOAS 可以做独舞。 SDR 基本上将我们的 Spring Data 驱动的存储库公开为 REST 服务,根据我们的存储库设计及其扩展的其他存储库,例如 GraphRepositoryPagingAndSortingRepository 等,它可以用作自我探索机器。
    3. 据我所知,Spring HATEOAS 是链接构建机器,它使用我们的 REST 服务或控制器类来构建到给定资源的链接。例如

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

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

    4. 对于验证或安全性,我发现这个link 很有用。但仍在尝试实施它。

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

    【讨论】:

    • 对于 Spring Data REST + 安全性,请查看 github.com/spring-projects/spring-data-examples/tree/master/…
    • 嗨 agpt 我已经写了 spring restfull web server.Nut 我没有任何 web.xml 文件。所以我遇到了同样的问题,我需要在哪里添加 org.springframework.web.context。 spring bean 配置中的 request.RequestContextListener ??
    猜你喜欢
    • 2016-12-07
    • 2017-08-23
    • 1970-01-01
    • 2015-04-04
    • 2018-05-25
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 2017-04-30
    相关资源
    最近更新 更多