Spring Data REST 构建 RESTful Web 服务
你需要的
-
大约 15 分钟
-
一个喜欢的文本编辑器或 IDE
-
Java 17 或更高版本
-
Gradle 7.5+ 或 Maven 3.5+
使用 Spring Initializr 创建项目
你可以使用这个 预初始化的项目 ,并点击生成,下载一个 ZIP 文件。
如果你想要手动初始化项目:
-
选择 Gradle 或 Maven 以及你想使用的语言。本指南假设你选择了 Java 。
-
点击 Dependencies,选择 Rest Repositories、Spring Data JPA 和 PostgreSQL Driver。
-
点击 “GENERATE”。
-
下载生成的 ZIP 文件,这是一个用你的选择配置的 Web 应用的压缩包。
Spring Boot 配置
在 /src/main/resources/application.properties 中,添加:
spring.datasource.url=jdbc:postgresql://localhost:5432/demo
spring.datasource.username=postgres
spring.datasource.password=123456
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.open-in-view=false
spring.jpa.hibernate.ddl-auto=update
spring.data.rest.basePath=/api
Entity 层
创建一个新的 Entity 对象,如下所示(在 src/main/java/com/stdu/rest/entity/User.java 中):
package com.stdu.rest.entity;
import jakarta.persistence.*;
import java.io.Serializable;
@Entity
@Table(name = "users")
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(nullable = false)
private String firstName;
@Column(nullable = false)
private String lastName;
private String description;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
Repository 层
创建一个新的 Repository 接口,如下所示(在 src/main/java/com/stdu/rest/repository/UserRepository.java 中):
package com.stdu.rest.repository;
import com.stdu.rest.entity.User;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
import org.springframework.web.bind.annotation.CrossOrigin;
import java.util.List;
@CrossOrigin
@RepositoryRestResource(collectionResourceRel = "users", path = "users")
public interface UserRepository extends PagingAndSortingRepository<User, Long>, CrudRepository<User, Long> {
List<User> findByFirstName(@Param("name") String name);
}
测试应用程序
打开浏览器,访问 localhost:8080/api
GET /
{
"_links" : {
"users" : {
"href" : "http://localhost:8080/api/users{?page,size,sort}",
"templated" : true
},
"profile" : {
"href" : "http://localhost:8080/api/profile"
}
}
}
GET /users
{
"_embedded" : {
"users" : []
},
"_links" : {
"self" : {
"href" : "http://localhost:8080/api/users"
},
"profile" : {
"href" : "http://localhost:8080/api/profile/users"
},
"search" : {
"href" : "http://localhost:8080/api/users/search"
}
},
"page" : {
"size" : 20,
"totalElements" : 0,
"totalPages" : 1,
"number" : 0
}
}
可以看到 users 是一个空数组,接下来使用 Axios 创建一个新的 User
:
let config = {
baseURL: 'http://localhost:8080/api'
};
let data = {
"firstName": "Xiaobang",
"lastName": "Shi",
"description": "Otaku"
};
下面的例子使用了一个 POST
调用:
POST /users
axios.post('/users', data, config).then(function (response) {
console.log(response);
}).catch(function (error) {
console.log(error);
});
GET /users/:id
{
"firstName" : "Xiaobang",
"lastName" : "Shi",
"description" : "Otaku",
"_links" : {
"self" : {
"href" : "http://localhost:8080/api/users/1"
},
"user" : {
"href" : "http://localhost:8080/api/users/1"
}
}
}
下面的例子使用了一个 PUT
调用:
let data = {
"firstName": "Jiaqi",
"lastName": "Liu",
"description": "HeroPoi"
}
PUT /users/:id
axios.put('users/1', data, config).then(function (response) {
console.log(response);
}).catch(function (error) {
console.log(error);
});
下面的例子使用了一个 PATCH
调用:
let data = {
"description": "Otaku Hero"
}
PATCH /users/:id
axios.patch('users/1', data, config).then(function (response) {
console.log(response);
}).catch(function (error) {
console.log(error);
});
下面的例子使用了一个 DELETE
调用:
DELETE /users/:id
axios.delete('users/1', config).then(function (response) {
console.log(response);
}).catch(function (error) {
console.log(error);
});
总结
你已经开发了一个具有 基于超媒体 的 RESTful 前端和基于 JPA 的后端的应用程序。
项目源码:Spring Boot Examples