Spring Data REST 构建 RESTful Web 服务


你需要的

  • 大约 15 分钟

  • 一个喜欢的文本编辑器或 IDE

  • Java 17 或更高版本

  • Gradle 7.5+ 或 Maven 3.5+

使用 Spring Initializr 创建项目

你可以使用这个 预初始化的项目 ,并点击生成,下载一个 ZIP 文件。

如果你想要手动初始化项目:

点击 Spring Initializr

  1. 选择 Gradle 或 Maven 以及你想使用的语言。本指南假设你选择了 Java 。

  2. 点击 Dependencies,选择 Rest Repositories、Spring Data JPA 和 PostgreSQL Driver。

  3. 点击 “GENERATE”。

  4. 下载生成的 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"
    }
  }
}

继续访问 localhost:8080/api/users

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);
});

访问 localhost:8080/api/users/1

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

参考

Accessing JPA Data with REST