前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Data Rest!五分钟帮我们实现Rest服务

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

作者头像
品茗IT
发布2020-05-28 16:08:43
2.8K0
发布2020-05-28 16:08:43
举报
文章被收录于专栏:品茗IT品茗IT

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服务不是梦,比我写文章都快!

二、配置

本文以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和数据源。

代码语言:javascript
复制
<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相关信息即可,如:

代码语言:javascript
复制
server.port=8040

spring.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=123456

spring.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=false

spring.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 需要的注解:

代码语言:javascript
复制
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;
	@JsonIgnore
	private 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注解:

代码语言:javascript
复制
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

代码语言:javascript
复制
{
  "_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这条记录:

代码语言:javascript
复制
{
  "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排序的:

代码语言:javascript
复制
{
  "_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的接口列表:

代码语言:javascript
复制
{
  "_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

代码语言:javascript
复制
{
  "_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 数据:

代码语言:javascript
复制
{
	"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服务真的很赞,而且不影响传统写法,很适合快速开发。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-09-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Spring Data Rest!几分钟帮我们实现Rest服务
  • 一、概述
  • 二、配置
    • 2.1 依赖
      • 2.2 配置文件
      • 三、配置Rest访问
      • 四、使用方法
        • 4.1 查询
          • 4.2 保存
            • 4.3 更新
              • 4.4 删除
                • 五、总结
                相关产品与服务
                Elasticsearch Service
                腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档