配置 REST URL 路径
您可以配置 URL 路径的分段,从中导出 JPA 存储库的资源。为此,请在类级别或查询方法级别添加注释。
默认情况下,导出器会公开CrudRepository
通过使用域类的名称。Spring Data REST 还应用 Evo Inflector 来复数化这个词。请考虑以下存储库定义:
interface PersonRepository extends CrudRepository<Person, Long> {}
前面示例定义的存储库在localhost:8080/persons/
.
要更改仓库的导出方式,请添加@RestResource
注解,如下例所示:
@RepositoryRestResource(path = "people")
interface PersonRepository extends CrudRepository<Person, Long> {}
上述示例定义的存储库可在localhost:8080/people/
.
如果定义了查询方法,则这些方法也默认按其名称公开,如下例所示:
interface PersonRepository extends CrudRepository<Person, Long> {
List<Person> findByName(String name);
}
前面示例中的方法在localhost:8080/persons/search/findByName
.
所有查询方法资源都公开在search 资源。 |
要更改公开此查询方法的 URL 段,您可以使用@RestResource
注解,如下例所示:
@RepositoryRestResource(path = "people")
interface PersonRepository extends CrudRepository<Person, Long> {
@RestResource(path = "names")
List<Person> findByName(String name);
}
现在,前面示例中的 query 方法在localhost:8080/people/search/names
.
处理rel
属性
由于这些资源都是可发现的,因此您还可以影响rel
属性显示在导出器发送的链接中。
例如,在默认配置中,如果您向localhost:8080/persons/search
要找出公开的查询方法,您可以返回类似于以下内容的链接列表:
{
"_links" : {
"findByName" : {
"href" : "http://localhost:8080/persons/search/findByName"
}
}
}
要将rel
值,请使用rel
属性@RestResource
annotation 中,如下例所示:
@RepositoryRestResource(path = "people")
interface PersonRepository extends CrudRepository<Person, Long> {
@RestResource(path = "names", rel = "names")
List<Person> findByName(String name);
}
前面的示例生成以下 link 值:
{
"_links" : {
"names" : {
"href" : "http://localhost:8080/persons/search/names"
}
}
}
这些 JSON 代码段假定您使用 Spring Data REST 的默认格式 HAL。您可以关闭 HAL,这会导致输出看起来不同。但是,您可以覆盖rel names 完全独立于渲染格式。 |
您可以将rel
,如下例所示:
@RepositoryRestResource(path = "people", rel = "people")
interface PersonRepository extends CrudRepository<Person, Long> {
@RestResource(path = "names", rel = "names")
List<Person> findByName(String name);
}
更改rel
的存储库会更改顶级名称,如以下示例输出所示:
{
"_links" : {
"people" : {
"href" : "http://localhost:8080/people"
},
…
}
}
在上述输出所示的顶级片段中:
-
path = "people"
更改了href
从/persons
自/people
. -
rel = "people"
将该链接的名称从persons
自people
.
当您导航到search
资源中,Finder 方法的@RestResource
annotation 更改了路径,如下所示:
{
"_links" : {
"names" : {
"href" : "http://localhost:8080/people/search/names"
}
}
}
存储库定义中的此注释集合已导致以下更改:
-
存储库级注释的
path = "people"
反映在基 URI 中,其中/people
. -
包含 finder 方法为您提供
/people/search
. -
path = "names"
创建 URI/people/search/names
. -
rel = "names"
将该链接的名称从findByNames
自names
.
隐藏某些存储库、查询方法或字段
您可能根本不希望导出某个存储库、存储库上的查询方法或实体的字段。示例包括隐藏字段,例如password
在User
对象和类似的敏感数据。要告诉导出器不要导出这些项目,请使用@RestResource
并设置exported = false
.
例如,要跳过导出存储库,您可以创建类似于以下示例的存储库定义:
@RepositoryRestResource(exported = false)
interface PersonRepository extends CrudRepository<Person, Long> {}
要跳过导出查询方法,您可以使用@RestResource(exported = false)
如下:
@RepositoryRestResource(path = "people", rel = "people")
interface PersonRepository extends CrudRepository<Person, Long> {
@RestResource(exported = false)
List<Person> findByName(String name);
}
同样,要跳过导出字段,您可以使用@RestResource(exported = false)
如下:
@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
,覆盖所有这些方法,并将注释添加到覆盖的方法中,如下所示:
@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 . |