对于最新的稳定版本,请使用 Spring Data REST 4.3.1! |
对于最新的稳定版本,请使用 Spring Data REST 4.3.1! |
您可以配置导出 JPA 存储库资源的 URL 路径段。为此,请在类级别或查询方法级别添加批注。
默认情况下,导出器使用域类的名称公开 you。 Spring Data REST 还应用 Evo Inflector 来复数该词。请考虑以下存储库定义:CrudRepository
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
所有查询方法资源都公开在资源下。search |
处理属性rel
由于这些资源都是可发现的,因此您还可以影响属性在导出器发送的链接中的显示方式。rel
例如,在默认配置中,如果发出请求以找出公开的查询方法,则会返回类似于以下内容的链接列表:localhost:8080/persons/search
{
"_links" : {
"findByName" : {
"href" : "http://localhost:8080/persons/search/findByName"
}
}
}
若要更改值,请使用批注上的属性,如以下示例所示:rel
rel
@RestResource
@RepositoryRestResource(path = "people")
interface PersonRepository extends CrudRepository<Person, Long> {
@RestResource(path = "names", rel = "names")
List<Person> findByName(String name);
}
前面的示例将生成以下链接值:
{
"_links" : {
"names" : {
"href" : "http://localhost: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" : "http://localhost:8080/people"
},
…
}
}
在前面输出中显示的顶级片段中:
-
path = "people"
将 from 中的值更改为 。href
/persons
/people
-
rel = "people"
将该链接的名称从 更改为 。persons
people
当您导航到此存储库的资源时,finder 方法的注释已更改路径,如下所示:search
@RestResource
{
"_links" : {
"names" : {
"href" : "http://localhost:8080/people/search/names"
}
}
}
存储库定义中的此批注集合已导致以下更改:
-
存储库级注解反映在基 URI 中。
path = "people"
/people
-
包含查找器方法可为您提供 .
/people/search
-
path = "names"
创建 的 URI。/people/search/names
-
rel = "names"
将该链接的名称从 更改为 。findByNames
names
这些 JSON 代码片段假定您使用 Spring Data REST 的默认格式 HAL。您可以关闭 HAL,这会导致输出看起来不同。但是,覆盖名称的能力完全独立于呈现格式。rel |
隐藏某些存储库、查询方法或字段
您可能根本不希望导出某个存储库、存储库上的查询方法或实体的字段。示例包括隐藏字段(如对象和类似的敏感数据)。要告诉导出器不要导出这些项目,请用 和 设置 进行注释。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 方法
如果不想在 上公开保存或删除方法,可以通过覆盖要关闭的方法并将注释放在覆盖的版本上来使用该设置。例如,为了防止 HTTP 用户调用 的 删除方法,将所有方法全部覆盖,并将注解添加到被覆盖的方法中,如下所示:CrudRepository
@RestResource(exported = false)
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);
}
重写这两种方法非常重要。为了提高运行时性能,导出器目前使用一种有点幼稚的算法来确定要使用的 CRUD 方法。您目前无法关闭采用 ID 的版本,但无法导出采用实体实例的版本。目前,您可以导出方法,也可以不导出方法。如果您想关闭它们,请记住,您必须使用 .delete delete delete exported = false |
重写这两种方法非常重要。为了提高运行时性能,导出器目前使用一种有点幼稚的算法来确定要使用的 CRUD 方法。您目前无法关闭采用 ID 的版本,但无法导出采用实体实例的版本。目前,您可以导出方法,也可以不导出方法。如果您想关闭它们,请记住,您必须使用 .delete delete delete exported = false |