Spring-Data-REST轻松搞定RESTfulAPI

向量数据库大模型微服务

背景

昨天同事问我有没有研究过 spring-boot-starter-data-rest,没有~但是看名字就大概知道是做什么的(命名的重要性),因为之前有了解过 spring-boot-starter-data-jpa ,过一会发过两个截图过来。真的很强大,感觉这个在使用RESTful风格接口协议的微服务时都不用写Controller了。

什么是Spring Data REST

Spring Data REST是基于Spring Data的Repository,把 Repository 自动输出为REST资源,目前支持Spring Data JPA、Spring Data MongoDB、Spring Data Neo4j、Spring Data GemFire、Spring Data Cassandra的 Repository 自动转换成REST服务。注意是自动 。Spring Data REST把我们需要编写的大量REST模版接口做了自动化实现。

picture.image

两行代码即可实现

在网上大概了解一下,然后动手做个demo,果然是两行代码即可实现。

  • 新建一个Spring Boot项目,添加依赖

 1. `<parent>`
2. `<artifactId>spring-boot</artifactId>`
3. `<groupId>com.gemantic</groupId>`
4. `<version>1.0-SNAPSHOT</version>`
5. `</parent>`
6. 
7. `<dependencies>`
8. `<dependency>`
9. `<groupId>org.springframework.boot</groupId>`
10. `<artifactId>spring-boot-starter</artifactId>`
11. `</dependency>`
12. 
13. `<dependency>`
14. `<groupId>org.springframework.boot</groupId>`
15. `<artifactId>spring-boot-starter-web</artifactId>`
16. `</dependency>`
17. 
18. `<dependency>`
19. `<groupId>org.springframework.boot</groupId>`
20. `<artifactId>spring-boot-starter-data-rest</artifactId>`
21. `</dependency>`
22. 
23. `<dependency>`
24. `<groupId>org.springframework.boot</groupId>`
25. `<artifactId>spring-boot-starter-data-jpa</artifactId>`
26. `</dependency>`
27. 
28. `<dependency>`
29. `<groupId>mysql</groupId>`
30. `<artifactId>mysql-connector-java</artifactId>`
31. `<scope>runtime</scope>`
32. `</dependency>`
33. 
34. `<!-- 简化代码 -->`
35. `<dependency>`
36. `<groupId>org.projectlombok</groupId>`
37. `<artifactId>lombok</artifactId>`
38. `<version>1.16.14</version>`
39. `</dependency>`
40. 
41. `<!-- 类似swagger -->`
42. `<dependency>`
43. `<groupId>org.springframework.data</groupId>`
44. `<artifactId>spring-data-rest-hal-browser</artifactId>`
45. `</dependency>`
46. 
47. `<!-- datasource pool-->`
48. `<dependency>`
49. `<groupId>com.alibaba</groupId>`
50. `<artifactId>druid</artifactId>`
51. `<version>1.0.14</version>`
52. `</dependency>`
53. 
54. `<dependency>`
55. `<groupId>org.springframework.boot</groupId>`
56. `<artifactId>spring-boot-starter-test</artifactId>`
57. `<scope>test</scope>`
58. `</dependency>`
59. 
60. `</dependencies>`

  • 表结构

 1. `CREATE TABLE `user` (`
2. ``id` bigint(20) NOT NULL AUTO_INCREMENT,`
3. ``user_name` varchar(100) DEFAULT NULL,`
4. ``password` varchar(100) DEFAULT NULL,`
5. ``phone` varchar(100) DEFAULT NULL,`
6. ``locked` tinyint(1) DEFAULT '0',`
7. `PRIMARY KEY (`id`),`
8. `UNIQUE KEY `idx_user_user_name` (`user_name`)`
9. `) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;`

放点数据进去,如下图:

picture.image

  • 与表对应的实体

 1. `import lombok.Data;`
2. 
3. `import javax.persistence.Entity;`
4. `import javax.persistence.GeneratedValue;`
5. `import javax.persistence.GenerationType;`
6. `import javax.persistence.Id;`
7. 
8. `/**`
9. `* Created by Yezhiwei on 17/10/31.`
10. `*/`
11. 
12. `@Data`
13. `@Entity`
14. `public class User {`
15. 
16. `@Id`
17. `@GeneratedValue(strategy= GenerationType.AUTO)`
18. `private Long id;`
19. 
20. `private String userName;`
21. 
22. `private String password;`
23. 
24. `private String phone;`
25. 
26. `private Integer locked;`
27. `}`

  • 创建User表对应的Repository

 1. `import com.gemantic.model.User;`
2. `import org.springframework.data.jpa.repository.JpaRepository;`
3. `import org.springframework.data.rest.core.annotation.RepositoryRestResource;`
4. 
5. `/**`
6. `* @author Yezhiwei`
7. `* @date 17/12/16`
8. `*/`
9. `@RepositoryRestResource(path="user")`
10. `public interface UserRepository extends JpaRepository<User, Long> {`
11. 
12. `}`

自定了一个接口UserRepository 继承了JpaRepository,其中泛型中的User是实体类,Long是主键类型,在类的头部加上了一个 @RepositoryRestResource注解,并添加了一个Path为user。就这样,两行代码即可实现User实体类的RESTFul风格的所有接口。

  • 测试,访问 http://localhost:8080/user

picture.image

接口中自动附带查询详情的链接

分页测试, http://localhost:8080/user?size=2&page=3

picture.image

接口中同样自动附带分页的链接,分页信息

这样更便于解耦前后端,后端如果链接地址变了,前端不用改,直接用Link里面的地址访问

  • 同样,也提供了一个类似swagger的接口测试UI

 1. `<!-- 类似swagger -->`
2. `<dependency>`
3. `<groupId>org.springframework.data</groupId>`
4. `<artifactId>spring-data-rest-hal-browser</artifactId>`
5. `</dependency>`

picture.image


问题:

  • 现在还不知道自动转换成REST服务有哪些缺点?

  • 自动转换成REST服务,是否支持自定义功能?

  • 还需要进一步测试与Feign一起使用的情况。

  • ......

picture.image

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
KubeZoo: 轻量级 Kubernetes 多租户方案探索与实践
伴随云原生技术的发展,多个租户共享 Kubernetes 集群资源的业务需求应运而生,社区现有方案各有侧重,但是在海量小租户的场景下仍然存在改进空间。本次分享对现有多租户方案进行了总结和对比,然后提出一种基于协议转换的轻量级 Kubernetes 网关服务:KubeZoo,该方案能够显著降低多租户控制面带来的资源和运维成本,同时提供安全可靠的租户隔离性。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论