SpringBoot - 使用Spring Data JPA操作数据库4(构建RESTful服务2:进阶技巧)
二、常用配置
1,在 application.properties 中配置
我们可以在项目的 application.properties 文件中配置一些常用属性:#每页默认记录数,默认值为20
spring.data.rest.default-page-size=2
#分页查询页码参数名,默认值为:page
spring.data.rest.page-param-name=page
#分页查询记录数参数名,默认值为:size
spring.data.rest.limit-param-name=size
#分页查询排序参数名,默认值为:sort
spring.data.rest.sort-param-name=sort
#base-path表示给所有请求路径前都加上前缀
spring.data.rest.base-path=/api
#添加成功时是否返回添加内容
spring.data.rest.return-body-on-create=true
#更新成功时是否返回更新内容
spring.data.rest.return-body-on-update=true
2,在代码中配置
上面的那些配置我们也可以在 Java 代码中配置,且代码中配置的优先级高于 application.properties 配置的优先级。@Configuration public class RestConfig extends RepositoryRestConfigurerAdapter { @Override public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { config.setDefaultPageSize(2) .setPageParamName("page") .setLimitParamName("size") .setSortParamName("sort") .setBasePath("/api") .setReturnBodyOnCreate(true) .setReturnBodyOnUpdate(true); } }
三、自定义请求路径、结果 key 值
(1)默认情况下请求路径都是实体类名小写加 s,如果开发者想要对请求路径进行重定义,通过 @RepositoryRestResource 注解即可实现:@RepositoryRestResource 注解属性说明:
- path 属性表示将所有请求路径中的 books 都修改为 bs1,如 http://localhost:8080/bs1
- collectionResourceRel 属性表示将返回的 JSON 集合中的 book 集合的 key 修改为 bs2。
- itemResourceRel 属性表示将返回的 JSON 集合中的单个 book 的 key 修改为 b。
@RepositoryRestResource(path = "bs1", collectionResourceRel = "bs2", itemResourceRel = "b") public interface BookDao extends JpaRepository<Book, Integer> { }
(2)测试如下:
四、自定义查询方法
(1)默认的查询方法支持分页查询、排序查询以及按照 id 查询,如果我们想要按照某个属性查询,只需要在 BookDao 中定义相关方法并暴露出去即可。
自定义查询只需要在 BookDao 中定义相关查询方法即可:
- 方法定义好之后可以不添加 @RestResource 注解,默认路径就是方法名。
- 如果想要对查询路径进行自定义,只需添加 @RestResource 注解即可,path 属性表示最新的路径。
public interface BookDao extends JpaRepository<Book, Integer> { // 使用默认的路径名(方法名) List<Book> findByAuthorContains(@Param("author") String author); // 使用自定义的路径名 @RestResource(path = "name", rel = "n") Book findByNameEquals(@Param("name") String name); }
(2)比如上面定义后,两个方法的查询路径分别是:
- 第一个路径:http://localhost:8080/books/search/findByAuthorContains?author=路遥
- 第二个路径:http://localhost:8080/books/search/name?name=平凡的世界
(3)我们也可以直接访问 http://localhost:8080/books/search 路径查看该实体类暴露出来了哪些查询方法。
注意:@RestResource 注解中的 rel 属性可以重定义路径的 key
五、隐藏方法
1,隐藏整个 Repository 类的所有方法
(1)默认情况下,凡事继承 Repository 接口(或者 Repository 子类)的类都会被暴露出来,即开发者可以执行基本的增删改查方法。(2)如果某些类继承了 Repository 但又不想暴露相关操作,可以将 @RepositoryRestResource 注解中的 exported 属性设置为 false。那么它的增删改查接口以及自定义的方法接口都会失效。
@RepositoryRestResource(exported = false) public interface BookDao extends JpaRepository<Book, Integer> { // 使用默认的路径名(方法名) List<Book> findByAuthorContains(@Param("author") String author); // 使用自定义的路径名 @RestResource(path = "name", rel = "n") Book findByNameEquals(@Param("name") String name); }
2,隐藏指定的方法
如果只是单纯地不想暴露中某个方法,则在方法上配置 @RestResource 注解,并将 exported 属性设置为 false。public interface BookDao extends JpaRepository<Book, Integer> { // 使用默认的路径名(方法名) @RestResource(exported = false) List<Book> findByAuthorContains(@Param("author") String author); // 使用自定义的路径名 @RestResource(path = "name", rel = "n") Book findByNameEquals(@Param("name") String name); }
六、配置 CORS(解决跨域请求问题)
1,全局配置
RESTful 工程同样会遇到跨域请求问题。而 CORS 的两种配置方式,一种是全局配置,在这里依然适用。具体的做法参考我之前写的文章:
2,单独配置
(1)CORS 配置另一种方式便是在方法上加注解。由于 RESTful 工程不需要开发者自己提供 Controller,因此可以将 @CrossOrigin 直接写在 Repository 上,这样该 Repository 的所有方法都支持跨域。
关于 @CrossOrigin 更详细的用法,可以参考我之前写的文章:
@CrossOrigin public interface BookDao extends JpaRepository<Book, Integer> { // 使用默认的路径名(方法名) List<Book> findByAuthorContains(@Param("author") String author); // 使用自定义的路径名 @RestResource(path = "name", rel = "n") Book findByNameEquals(@Param("name") String name); }
(2)如果只需要某个方法支持跨域,那么将 @CrossOrigin 注解添加到某一个方法中即可。
public interface BookDao extends JpaRepository<Book, Integer> { // 使用默认的路径名(方法名) @CrossOrigin List<Book> findByAuthorContains(@Param("author") String author); // 使用自定义的路径名 @RestResource(path = "name", rel = "n") Book findByNameEquals(@Param("name") String name); }