对于最新的稳定版本,请使用 Spring Data REST 4.4.0spring-doc.cn

配置 REST URL 路径

您可以配置 URL 路径的分段,从中导出 JPA 存储库的资源。为此,请在类级别或查询方法级别添加注释。spring-doc.cn

默认情况下,导出器使用域类的名称公开 u。Spring Data REST 还应用 Evo Inflector 来复数化这个词。请考虑以下存储库定义:CrudRepositoryspring-doc.cn

interface PersonRepository extends CrudRepository<Person, Long> {}

由上述示例定义的存储库在 中公开。localhost:8080/persons/spring-doc.cn

要更改存储库的导出方式,请在类级别添加注释,如下例所示:@RestResourcespring-doc.cn

@RepositoryRestResource(path = "people")
interface PersonRepository extends CrudRepository<Person, Long> {}

上述示例定义的存储库可在 中访问。localhost:8080/people/spring-doc.cn

如果定义了查询方法,则这些方法也默认按其名称公开,如下例所示:spring-doc.cn

interface PersonRepository extends CrudRepository<Person, Long> {

  List<Person> findByName(String name);
}

前面示例中的方法在 中公开。localhost:8080/persons/search/findByNamespring-doc.cn

所有查询方法资源都公开在资源下。search

要更改公开此查询方法的 URL 段,您可以再次使用注释,如下例所示:@RestResourcespring-doc.cn

@RepositoryRestResource(path = "people")
interface PersonRepository extends CrudRepository<Person, Long> {

  @RestResource(path = "names")
  List<Person> findByName(String name);
}

现在,前面示例中的 query 方法在 中公开。localhost:8080/people/search/namesspring-doc.cn

处理属性rel

由于这些资源都是可发现的,因此您还可以影响属性在导出器发送的链接中的显示方式。relspring-doc.cn

例如,在默认配置中,如果您发出请求以找出公开的查询方法,则会返回类似于以下内容的链接列表:localhost:8080/persons/searchspring-doc.cn

{
  "_links" : {
    "findByName" : {
      "href" : "http://localhost:8080/persons/search/findByName"
    }
  }
}

要更改该值,请在注释上使用 property,如下例所示:relrel@RestResourcespring-doc.cn

@RepositoryRestResource(path = "people")
interface PersonRepository extends CrudRepository<Person, Long> {

  @RestResource(path = "names", rel = "names")
  List<Person> findByName(String name);
}

前面的示例生成以下 link 值:spring-doc.cn

{
  "_links" : {
    "names" : {
      "href" : "http://localhost:8080/persons/search/names"
    }
  }
}
这些 JSON 代码段假定您使用 Spring Data REST 的默认格式 HAL。您可以关闭 HAL,这会导致输出看起来不同。但是,覆盖名称的能力完全独立于渲染格式。rel

您可以更改存储库的 ,如下例所示:relspring-doc.cn

@RepositoryRestResource(path = "people", rel = "people")
interface PersonRepository extends CrudRepository<Person, Long> {

  @RestResource(path = "names", rel = "names")
  List<Person> findByName(String name);
}

更改存储库的 会更改顶级名称,如以下示例输出所示:relspring-doc.cn

{
  "_links" : {
    "people" : {
      "href" : "http://localhost:8080/people"
    },
    …
  }
}

在上述输出所示的顶级片段中:spring-doc.cn

  • path = "people"将 中的值从 更改为 。href/persons/peoplespring-doc.cn

  • rel = "people"将该链接的名称从 更改为 。personspeoplespring-doc.cn

当您导航到此存储库的资源时,finder 方法的注释已更改路径,如下所示:search@RestResourcespring-doc.cn

{
  "_links" : {
    "names" : {
      "href" : "http://localhost:8080/people/search/names"
    }
  }
}

存储库定义中的此注释集合已导致以下更改:spring-doc.cn

  • 存储库级注释反映在基 URI 中。path = "people"/peoplespring-doc.cn

  • 包含查找器方法可为您提供 ./people/searchspring-doc.cn

  • path = "names"创建 URI 。/people/search/namesspring-doc.cn

  • rel = "names"将该链接的名称从 更改为 。findByNamesnamesspring-doc.cn

隐藏某些存储库、查询方法或字段

您可能根本不希望导出某个存储库、存储库上的查询方法或实体的字段。示例包括隐藏字段(如对象和类似的敏感数据)。要告诉导出器不要导出这些项目,请使用 和 set 为它们添加注释。passwordUser@RestResourceexported = falsespring-doc.cn

例如,要跳过导出存储库,您可以创建类似于以下示例的存储库定义:spring-doc.cn

@RepositoryRestResource(exported = false)
interface PersonRepository extends CrudRepository<Person, Long> {}

要跳过导出查询方法,可以使用 . 注释查询方法,如下所示:@RestResource(exported = false)spring-doc.cn

@RepositoryRestResource(path = "people", rel = "people")
interface PersonRepository extends CrudRepository<Person, Long> {

  @RestResource(exported = false)
  List<Person> findByName(String name);
}

同样,要跳过导出字段,可以使用 . 注释字段,如下所示:@RestResource(exported = false)spring-doc.cn

@Entity
public class Person {

  @Id @GeneratedValue private Long id;

  @OneToMany
  @RestResource(exported = false)
  private Map<String, Profile> profiles;
}
投影提供了更改导出内容并有效避开这些设置的方法。如果针对同一域对象创建任何投影,请确保不要导出字段。

隐藏存储库 CRUD 方法

如果不想在 上公开 save 或 delete 方法,则可以通过覆盖要关闭的方法并将注释放在被覆盖的版本上来使用该设置。例如,要防止 HTTP 用户调用 的 delete 方法,请覆盖所有方法,并将注释添加到被覆盖的方法中,如下所示:CrudRepository@RestResource(exported = false)CrudRepositoryspring-doc.cn

@RepositoryRestResource(path = "people", rel = "people")
interface PersonRepository extends CrudRepository<Person, Long> {

  @Override
  @RestResource(exported = false)
  void delete(Long id);

  @Override
  @RestResource(exported = false)
  void delete(Person entity);
}
重写这两种方法非常重要。为了获得更快的运行时性能,导出器当前使用一种有点幼稚的算法来确定要使用的 CRUD 方法。目前,您无法关闭采用 ID 的版本,但可以导出采用实体实例的版本。目前,您可以导出方法,也可以不导出。如果要关闭它们,请记住,您必须用 .deletedeletedeleteexported = false