返回 导航

SpringBoot / Cloud

hangge.com

SpringBoot - 使用Spring Data JPA操作数据库4(构建RESTful服务2:进阶技巧)

作者:hangge | 2019-11-22 08:10

二、常用配置  

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 集合中的单个 bookkey 修改为 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);
}
评论

全部评论(0)

回到顶部