背景
昨天同事问我有没有研究过 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模版接口做了自动化实现。
两行代码即可实现
在网上大概了解一下,然后动手做个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> • 表结构 61. CREATE TABLE `user` ( 62. `id` bigint(20) NOT NULL AUTO_INCREMENT, 63. `user_name` varchar(100) DEFAULT NULL, 64. `password` varchar(100) DEFAULT NULL, 65. `phone` varchar(100) DEFAULT NULL, 66. `locked` tinyint(1) DEFAULT '0', 67. PRIMARY KEY (`id`), 68. UNIQUE KEY `idx_user_user_name` (`user_name`) 69. ) ENGINE=InnoDB AUTO_INCREMENT=1 D
EFAULT CHARSET=utf8;
放点数据进去,如下图:
- 与表对应的实体
import lombok.Data; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; /** * Created by Yezhiwei on 17/10/31. */ @Data @Entity public class User { @Id @GeneratedValue(strategy= GenerationType.AUTO) private Long id; private String userName; private String password; private String phone; private Integer locked; }
- 创建User表对应的Repository
import com.gemantic.model.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.rest.core.annotation.RepositoryRestResource; /** * @author Yezhiwei * @date 17/12/16 */ @RepositoryRestResource(path="user") public interface UserRepository extends JpaRepository<User, Long> { }
自定了一个接口UserRepository 继承了JpaRepository,其中泛型中的User是实体类,Long是主键类型,在类的头部加上了一个 @RepositoryRestResource注解,并添加了一个Path为user。就这样,两行代码即可实现User实体类的RESTFul风格的所有接口。
- 测试,访问
http://localhost:8080/user
接口中自动附带查询详情的链接
分页测试, http://localhost:8080/user?size=2&page=3
接口中同样自动附带分页的链接,分页信息
这样更便于解耦前后端,后端如果链接地址变了,前端不用改,直接用Link里面的地址访问
- 同样,也提供了一个类似swagger的接口测试UI
<!-- 类似swagger --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-rest-hal-browser</artifactId> </dependency>
问题:
- 现在还不知道自动转换成REST服务有哪些缺点?
- 自动转换成REST服务,是否支持自定义功能?
- 还需要进一步测试与Feign一起使用的情况。
- ......