此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Data REST 4.5.3spring-doc.cadn.net.cn

配置 REST URL 路径

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

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

interface PersonRepository extends CrudRepository<Person, Long> {}

前面示例定义的存储库在localhost:8080/persons/.spring-doc.cadn.net.cn

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

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

前面示例定义的存储库可在localhost:8080/people/.spring-doc.cadn.net.cn

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

interface PersonRepository extends CrudRepository<Person, Long> {

  List<Person> findByName(String name);
}
所有查询方法资源都公开在search资源。

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

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

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

现在,前面示例中的查询方法公开在localhost:8080/people/search/names.spring-doc.cadn.net.cn

处理rel属性

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

例如,在默认配置中,如果您向localhost:8080/persons/search若要找出公开的查询方法,请返回类似于以下内容的链接列表:spring-doc.cadn.net.cn

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

要更改relvalue,请使用rel属性@RestResource注释,如以下示例所示:spring-doc.cadn.net.cn

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

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

前面的示例会产生以下链接值:spring-doc.cadn.net.cn

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

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

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

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

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

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

在前面输出中显示的顶级片段中:spring-doc.cadn.net.cn

当您导航到search资源,finder 方法的@RestResource注释已更改路径,如下所示:spring-doc.cadn.net.cn

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

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

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

您可能根本不希望导出某个存储库、存储库上的查询方法或实体的字段。示例包括隐藏字段,例如passwordUser对象和类似的敏感数据。要告诉导出器不要导出这些项目,请使用@RestResource并设置exported = false.spring-doc.cadn.net.cn

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

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

要跳过导出查询方法,您可以使用@RestResource(exported = false)如下:spring-doc.cadn.net.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.cadn.net.cn

@Entity
public class Person {

  @Id @GeneratedValue private Long id;

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

隐藏存储库 CRUD 方法

如果您不想在CrudRepository,您可以使用@RestResource(exported = false)通过覆盖要关闭的方法并将注释放置在覆盖的版本上来进行设置。例如,要防止 HTTP 用户调用CrudRepository,覆盖所有方法并将注释添加到覆盖的方法中,如下所示:spring-doc.cadn.net.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);
}
重要的是,你必须重写两者 delete方法。为了获得更快的运行时性能,导出器目前使用一种有点朴素的算法来确定要使用的 CRUD 方法。您当前无法关闭delete采用 ID,但导出采用实体实例的版本。目前,您可以导出delete方法与否。如果你想 关闭它们,请记住,你必须用exported = false.