配置 REST URL 路径
您可以配置导出 JPA 资源库资源的 URL 路径段。为此,请在类级别或查询方法级别添加注释。
默认情况下,导出器会使用域类的名称公开您的 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);
}
现在,前面示例中的查询方法在 localhost:8080/people/search/names
上公开。
处理 rel
属性
由于所有这些资源都是可发现的,因此您还可以影响导出器发送的链接中显示的 rel
属性。
例如,在默认配置中,如果您发出请求到 localhost:8080/persons/search
以找出公开的查询方法,您将收到类似于以下内容的链接列表
{
"_links" : {
"findByName" : {
"href" : "https://127.0.0.1:8080/persons/search/findByName"
}
}
}
要更改 rel
值,请在 @RestResource
注释上使用 rel
属性,如下例所示
@RepositoryRestResource(path = "people")
interface PersonRepository extends CrudRepository<Person, Long> {
@RestResource(path = "names", rel = "names")
List<Person> findByName(String name);
}
前面的示例导致以下链接值
{
"_links" : {
"names" : {
"href" : "https://127.0.0.1:8080/persons/search/names"
}
}
}
这些 JSON 代码片段假设您使用 Spring Data REST 的默认格式 HAL。您可以关闭 HAL,这将导致输出看起来有所不同。但是,您覆盖 rel 名称的能力与渲染格式完全无关。 |
您可以更改资源库的 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" : "https://127.0.0.1:8080/people"
},
…
}
}
在前面输出中显示的顶级片段中
-
path = "people"
将href
中的值从/persons
更改为/people
。 -
rel = "people"
将该链接的名称从persons
更改为people
。
当您导航到此资源库的 search
资源时,查找方法的 @RestResource
注释已更改路径,如下所示
{
"_links" : {
"names" : {
"href" : "https://127.0.0.1:8080/people/search/names"
}
}
}
资源库定义中的此注释集合导致以下更改
-
资源库级注释的
path = "people"
反映在基本 URI 中,为/people
。 -
包含查找方法为您提供
/people/search
。 -
path = "names"
创建/people/search/names
的 URI。 -
rel = "names"
将该链接的名称从findByNames
更改为names
。
隐藏某些资源库、查询方法或字段
您可能根本不希望导出某个资源库、资源库上的查询方法或实体的字段。例如,隐藏 User
对象上的 password
等字段以及类似的敏感数据。要告诉导出器不要导出这些项目,请使用 @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 方法。您目前无法关闭采用 ID 的 delete 版本,但可以导出采用实体实例的版本。目前,您可以导出或不导出 delete 方法。如果您想关闭它们,请记住您必须使用 exported = false 对这两个版本进行注释。 |