最广泛的定制,就是查询,因为增删改操作的变化不像查询这么丰富。对于查询的定制,非常容易,只需要提供相关的方法即可。例如根据姓名查询学生:
public interface StudentDao extends JpaRepository<Student, Integer> {
List<Student> findByNameContaining(@Param("name") String name);
}
注意,方法的定义,参数要有 @Param 注解。
定制完成后,重启项目,此时就多了一个查询接口,开发者可以通过 http://localhost:8080/books/search来查看和 book 相关的自定义接口都有哪些:
查询结果表示,只有一个自定义接口,接口名就是方法名,而且查询结果还给出了接口调用的示例。我们来尝试调用一下自己定义的查询接口:
我们可以根据实际情况,在 StudentDao 中定义任意多个查询方法,查询方法的定义规则和 Jpa 中一模一样,但是,这样有一个缺陷,就是 Jpa 中方法名太长,因此,如果不想使用方法名作为接口名,则可以自定义接口名:
public interface StudentDao extends JpaRepository<Student, Integer> {
@RestResource(rel = "byName",path = "name")
List<Student> findByNameContaining(@Param("name") String name);
}
@RestResource 注解中,两个参数的含义:
- rel 表示接口查询中,这个方法的 key
- path 表示请求路径
这样定义完成后,表示接口名为 byauthor ,重启项目,继续查询接口:
除了 rel 和 path 两个属性之外,@RestResource 中还有一个属性,exported 表示是否暴露接口,默认为 true ,表示暴露接口,即方法可以在前端调用,如果仅仅只是想定义一个方法,不需要在前端调用这个方法,可以设置 exported 属性为 false 。
如果不想暴露官方定义好的方法,例如根据 id 删除数据,只需要在自定义接口中重写该方法,然后在该方法上加 @RestResource 注解并且配置相关属性即可。
@RestResource(exported = false)
void deleteById(Integer integer);
另外,另外生成的 JSON 字符串中的集合名和单个 item 的名字都是可以自定义的,需要加在接口前面:
@RepositoryRestResource(collectionResourceRel = "sts",itemResourceRel = "st",path = "sts")
public interface StudentDao extends JpaRepository<Student, Integer> {
@RestResource(rel = "byName",path = "name")
List<Student> findByNameContaining(@Param("name") String name);
}
path 属性表示请求路径,请求路径默认是类名首字母小写+s,可以在这里自己重新定义。
跨域问题
之前讲过关于跨域的问题,有三种方式,@CrossOrigin注解可以加在方法上,接口前面,也可以提供一个配置类解决CORS跨域问题,在这里如果要实现跨域问题,直接将注解加在接口前面:
@CrossOrigin
@RepositoryRestResource(collectionResourceRel = "sts",itemResourceRel = "st",path = "sts")
public interface StudentDao extends JpaRepository<Student, Integer> {
@RestResource(rel = "byName",path = "name")
List<Student> findByNameContaining(@Param("name") String name);
}
其他配置
当然,也可以在 application.properties 中配置 REST 基本参数:
spring.data.rest.base-path=/rest
spring.data.rest.sort-param-name=sort
spring.data.rest.page-param-name=page
spring.data.rest.limit-param-name=size
spring.data.rest.max-page-size=20
spring.data.rest.default-page-size=0
spring.data.rest.return-body-on-update=true
spring.data.rest.return-body-on-create=true
配置含义,从上往下,依次是:
给所有的接口添加统一的前缀
配置排序参数的 key ,默认是 sort
配置分页查询时页码的 key,默认是 page
配置分页查询时每页查询页数的 key,默认是size
配置每页最大查询记录数,默认是 20 条
分页查询时默认的页码
更新成功时是否返回更新记录
添加成功时是否返回添加记录
例如,添加了spring.data.rest.base-path=/rest之后: