Spring Data Rest!几分钟帮我们实现Rest服务

一、概述

一直认为,Spring Data是与第三方组件进行数据交换的全家桶的整合,比如Spring Data Jpa是数据库使用,Spring Data LDAP是LDAP的使用,Spring Data Redis是Redis的使用,Spring Data Elasticsearch是Elasticsearch的使用。

然而,不起眼的地方有一个Spring Data Rest,按照常规定义,它是与Rest组件的数据交互?

非也,Spring Data Rest只是一种快速提供rest服务的方式,通过与Spring Data xxx整合,快速实现CRUD,自动将repository 自动输出为REST资源,目前支持Spring Data JPA、Spring Data MongoDB、Spring Data Neo4j、Spring Data GemFire、Spring Data Cassandra的 repository 自动转换成REST服务。

Spring Data REST把我们需要编写的大量REST模版接口做了自动化实现。

所以,五分钟实现rest服务不是梦,比我写文章都快!

首发地址:
品茗IT-同步发布

如果大家正在寻找一个java的学习环境,或者在开发中遇到困难,可以加入我们的java学习圈,点击即可加入,共同学习,节约学习时间,减少很多在学习中遇到的难题。

二、配置

本文以Spring Data JPA结合Spring Data Rest为例,描述如何使用Spring Data Rest。

2.1 依赖

引入spring-boot-starter-data-rest和spring-boot-starter-data-jpa,使用Spring Data JPA,就必须引入mysql-connector-java和数据源。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-dbcp2</artifactId>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>

2.2 配置文件

配置文件中只需要配置数据源和jpa相关信息即可,如:

server.port=8040spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/boot?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
spring.datasource.username=cff
spring.datasource.password=123456spring.datasource.type=org.apache.commons.dbcp2.BasicDataSource
spring.datasource.dbcp2.max-wait-millis=60000
spring.datasource.dbcp2.min-idle=20
spring.datasource.dbcp2.initial-size=2
spring.datasource.dbcp2.validation-query=SELECT 1
spring.datasource.dbcp2.connection-properties=characterEncoding=utf8
spring.datasource.dbcp2.validation-query=SELECT 1
spring.datasource.dbcp2.test-while-idle=true
spring.datasource.dbcp2.test-on-borrow=true
spring.datasource.dbcp2.test-on-return=falsespring.jpa.database=MySQL
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none
spring.jpa.hibernate.naming.implicit-strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy

三、配置Rest访问

需要在实体上加上Spring data jpa 需要的注解:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;import com.fasterxml.jackson.annotation.JsonIgnore;@Entity
@Table(name = "user_info")
public class UserInfo {@Id@Column(name = "user_name")private String userName;@JsonIgnoreprivate String passwd;private String name;private String mobile;private String valid;@Column(name = "user_type")private String userType;public void setUserName(String userName) {this.userName = userName;}public String getUserName() {return userName;}public void setPasswd(String passwd) {this.passwd = passwd;}public String getPasswd() {return passwd;}public void setName(String name) {this.name = name;}public String getName() {return name;}public void setMobile(String mobile) {this.mobile = mobile;}public String getMobile() {return mobile;}public void setValid(String valid) {this.valid = valid;}public String getValid() {return valid;}public void setUserType(String userType) {this.userType = userType;}public String getUserType() {return userType;}}

对于不想暴漏的字段,使用@JsonIgnore即可。

同时,在自定义的Repository中加入@RepositoryRestResource注解:

import java.util.List;import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
import org.springframework.data.rest.core.annotation.RestResource;import com.cff.springbootwork.domain.UserInfo;/*** collectionResourceRel是json的最外层显示名称,path是访问路径* * @author fufei**/
@RepositoryRestResource(collectionResourceRel = "user", path = "user")
public interface UserInfoDao extends JpaRepository<UserInfo, String> {List<UserInfo> findByName(@Param("name") String name);/*** 不暴漏删除接口*/@Override@RestResource(exported = false)void deleteById(String id);@Override@RestResource(exported = false)void delete(UserInfo entity);
}

对于不需要暴漏的接口,可以使用@RestResource(exported = false)隐藏该接口。

Spring Data Rest并不妨碍你传统的写法,你仍可以定义自己的controller、service和dao等!

四、使用方法

Springboot启动项目以后,我们就可以直接使用rest服务了。

4.1 查询

查询所有用户,使用get请求发送http://127.0.0.1:8040/user

{"_embedded" : {"user" : [ {"name" : null,"mobile" : "4444","valid" : "0","userType" : "1","_links" : {"self" : {"href" : "http://127.0.0.1:8040/user/15607110725"},"userInfo" : {"href" : "http://127.0.0.1:8040/user/15607110725"}}}, {"name" : null,"mobile" : "3242","valid" : null,"userType" : "2","_links" : {"self" : {"href" : "http://127.0.0.1:8040/user/3453sdf"},"userInfo" : {"href" : "http://127.0.0.1:8040/user/3453sdf"}}} ]},"_links" : {"self" : {"href" : "http://127.0.0.1:8040/user{?page,size,sort}","templated" : true},"profile" : {"href" : "http://127.0.0.1:8040/profile/user"},"search" : {"href" : "http://127.0.0.1:8040/user/search"}},"page" : {"size" : 20,"totalElements" : 2,"totalPages" : 1,"number" : 0}
}

上面 _links 节点下的内容提示我们

  • 可以使用http://127.0.0.1:8040/user{?page,size,sort}进行分页查询。
  • 使用http://127.0.0.1:8040/profile/user查看user实体相关。
  • 使用http://127.0.0.1:8040/user/search进行search查询(自定义的查询接口);
  • 每条记录都有提示如何根据主键进行查询的方法。

输入http://127.0.0.1:8040/user/15607110725,就能查出15607110725这条记录:

{"name" : "cff","mobile" : "4444","valid" : "0","userType" : "1","_links" : {"self" : {"href" : "http://127.0.0.1:8040/user/15607110725"},"userInfo" : {"href" : "http://127.0.0.1:8040/user/15607110725"}}
}

输入http://127.0.0.1:8040/user?page=0&size=10&sort=mobile,desc,可以进行分页排序查询,这里的排序字段sort是根据mobile字段desc排序的:

{"_embedded" : {"user" : [ {"name" : "cff","mobile" : "4444","valid" : "0","userType" : "1","_links" : {"self" : {"href" : "http://127.0.0.1:8040/user/15607110725"},"userInfo" : {"href" : "http://127.0.0.1:8040/user/15607110725"}}}, {"name" : null,"mobile" : "3242","valid" : "0","userType" : "1","_links" : {"self" : {"href" : "http://127.0.0.1:8040/user/3453sdf"},"userInfo" : {"href" : "http://127.0.0.1:8040/user/3453sdf"}}} ]},"_links" : {"self" : {"href" : "http://127.0.0.1:8040/user"},"profile" : {"href" : "http://127.0.0.1:8040/profile/user"},"search" : {"href" : "http://127.0.0.1:8040/user/search"}},"page" : {"size" : 10,"totalElements" : 2,"totalPages" : 1,"number" : 0}
}

输入http://127.0.0.1:8040/user/search,可以显示当前可以用来search的接口列表:

{"_links" : {"findByName" : {"href" : "http://127.0.0.1:8040/user/search/findByName{?name}","templated" : true},"self" : {"href" : "http://127.0.0.1:8040/user/search"}}
}

表示,可以用http://127.0.0.1:8040/user/search/findByName{?name}来进行search操作。

输入http://127.0.0.1:8040/user/search/findByName?name=cff

{"_embedded" : {"user" : [ {"name" : "cff","mobile" : "4444","valid" : "0","userType" : "1","_links" : {"self" : {"href" : "http://127.0.0.1:8040/user/15607110725"},"userInfo" : {"href" : "http://127.0.0.1:8040/user/15607110725"}}} ]},"_links" : {"self" : {"href" : "http://127.0.0.1:8040/user/search/findByName?name=cff"}}
}

4.2 保存

使用POST方式访问 http://localhost:8040/user并提交如下的JSON 数据:

{"userName":"test","passwd":"123123","mobile":"21312312","name":"heihei"
}

这里,因为上面实体userInfo的passwd字段加了@JsonIgnore注解,提交的json中,passwd是无效的。

官方文档中说可以把@RestResource(exported = false)加到字段上,经试验无效,所以遇到这种情况还是手写controller吧。

4.3 更新

跟保存方式一样,已经存在的字段,如果这次不填,就被更新为null了。

4.4 删除

使用DELETE方式请求 http://localhost:8040/user/test

会提示405 Method Not Allowed,这是因为我们在delete方法上加了@RestResource(exported = false)注解,去掉该注解即可,注意是delete方法,deleteById方法加不加都无所谓。

重新请求,成功删除。

五、总结

Spring Data Rest 官网 很详细的说明了如何使用Spring Data Rest,尽管Spring Data Rest有很大的局限性,但5分钟搞定一个Rest服务真的很赞,而且不影响传统写法,很适合快速开发。

快速构建项目

Spring项目快速开发工具:

一键快速构建Spring项目工具

一键快速构建SpringBoot项目工具

一键快速构建SpringCloud项目工具

一站式Springboot项目生成

Mysql一键生成Mybatis注解Mapper

Spring组件化构建

SpringBoot组件化构建

SpringCloud服务化构建

喜欢这篇文章么,喜欢就加入我们一起讨论SpringBoot使用吧!

Spring Data Rest!五分钟帮我们实现Rest服务相关推荐

  1. Spring Data JPA 五分钟快速入门和实践

    Spring Data JPA(类似于Java Web 中的 DAO) 操作声明持久层的接口(Repository) 三个核心接口: CrudRepository PagingAndSortingRe ...

  2. 【Java开发】 Spring 09 :Spring Data REST 实现并访问简单的超媒体服务

    Spring Data REST 是提供一个灵活和可配置的机制来编写可以通过HTTP公开的简单服务,简单来说,而且可以省去大部分controller和services的逻辑,因为Spring Data ...

  3. 终于有人把Spring Data JPA 讲明白了!

    01 什么是JPA? JPA的全称是 Java Persistence API , 中文的字面意思就是Java 的持久层 API , JPA 就是定义了一系列标准,让实体类和数据库中的表建立一个对应的 ...

  4. Spring Data JPA 从入门到精通~实际工作的应用场景

    在实际工作中,有哪些场景会用到自定义 Repository 呢,这里列出几种实际在工作中的应用案例. 1. 逻辑删除场景 可以用到上面说的两种实现方式,如果有框架级别的全局自定义 Respositor ...

  5. SpringBoot23-spingboot数据访问-Spring Data REST

    一,点睛Spring Data REST 1,什么是Spring Data REST Spring Data JPA是基于Spring Data的repository之上,可以将repository自 ...

  6. 五分钟快速入门 Spring Data JPA

    Spring Data JPA(类似于Java Web 中的 DAO) 操作声明持久层的接口(Repository) 三个核心接口: CrudRepository PagingAndSortingRe ...

  7. Spring Boot(五):spring data jpa的使用

    Spring Boot(五):spring data jpa的使用 一.spring data jpa介绍 1,JPA是什么 JPA(Java Persistence API)是Sun官方提出的Jav ...

  8. 五分钟,手撸一个Spring容器!

    Spring是我们最常用的开源框架,经过多年发展,Spring已经发展成枝繁叶茂的大树,让我们难以窥其全貌. 这节,我们回归Spring的本质,五分钟手撸一个Spring容器,揭开Spring神秘的面 ...

  9. Spring认证中国教育管理中心-Spring Data MongoDB教程五

    原标题:Spring认证中国教育管理中心-Spring Data MongoDB教程五(内容来源:Spring中国教育管理中心) 11.6.5.GeoJSON 支持 MongoDB 支持GeoJSON ...

最新文章

  1. php roadrunner,使用RoadRunner 加速 Laravel 应用
  2. 一步一步写算法(之寻找丢失的数)
  3. 07_数据库创建,添加c3p0操作所需的jar包,编写c3p0-config.xml文件,编写User.java,编写jdbcUtils.java实现操作数据库的模板工具类,UserDao编写,Dao
  4. oracle expdp自动导出数据,Oracle expdp数据泵远程导出
  5. 【转】Sql server锁,独占锁,共享锁,更新锁,乐观锁,悲观锁
  6. C#软件设计——小话设计模式原则之:接口隔离原则ISP
  7. 【Linux】Aria2 一键安装管理脚本 BT\PT一键安装包
  8. php web server setup,PHP本地开发利器:内置Web Server
  9. 【疑点】当子元素全部浮动时,怎么解决父元素塌陷的问题?
  10. c php curl post,php curl post
  11. 递归定义以及斐波那契数列的实现
  12. 土地调查图斑编号_土地年度变更调查“图斑类型”说明
  13. can总线不加末端电阻_【干货】80%修理工不知道的CAN线电阻知识点
  14. 打开资源管理器显示该文件没有与之关联的程序来执行该操作......
  15. AndroidStudio在Android9上调试闪退的问题
  16. Windows上搭建安卓的JAVA开发环境(Ecli...
  17. 薛非《品悟C-抛弃C程序设计中的谬误与恶习》读后感part1【转】
  18. 云计算学习笔记1——并行计算
  19. mysqldump全量恢复_【MySQL】全量+增量的备份/恢复
  20. Codeforces 刷水记录

热门文章

  1. 100天精通Python丨基础知识篇 —— 08、Python 最常用的 20 个包(按使用频率排序)
  2. 九十年代老学校的老旧回忆
  3. 堡垒机应用服务器发布原理,堡垒机原理
  4. 微服务时代 怎么看华为软件开发云实现DevOps落地
  5. javaScript变量提升以及函数提升
  6. AE出现已禁用刷新(要刷新视图,请释放Caps Lock)
  7. 怎么把照片缩小到200k?图片指定大小压缩怎么弄?
  8. 用 Java 实现天天酷跑(附源码),这个真的有点强了!
  9. windons下远程提交任务到linux上的spark集群
  10. 我的画作(在photoshop里面画的)