likes
comments
collection
share

Spring Boot 使用 Spring Web

作者站长头像
站长
· 阅读数 44

概述

Spring Boot 是 Spring Framework 的一个扩展,旨在简化 Spring 应用程序的创建和开发过程。它提供了开箱即用的配置,使得开发者能够快速搭建基于Spring的应用程序,而不需要过多的配置。

Spring Boot整合Spring Web可以帮助开发者快速构建RESTful风格的Web应用,实现对资源的增删改查操作。

这种技术组合适用于需要快速搭建基于HTTP协议的RESTful风格的Web服务,例如前后端分离的应用、微服务架构中的服务提供方等场景。

主要依赖项配置

pom.xml 中添加以下依赖项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

实体类定义

使用 Lombok 简化【学生】实体类的编写:

package com.jkxiao.springbootweb;  
  
import lombok.Data;  
  
@Data  
public class Student {  
    private Long id;  
    private String name;  
    private int age;  
}

Controller类编写

package com.jkxiao.springbootweb;  
  
import org.springframework.web.bind.annotation.*;  
  
import java.util.ArrayList;  
import java.util.List;  
  
@RestController  
@RequestMapping("/students")  
public class StudentController {  
    private List<Student> students = new ArrayList<>();  
  
    @GetMapping  
    public List<Student> getAllStudents() {  
        return students;  
    }  
  
    /**  
     * 根据id查询学生  
     * @param id  
     * @return  
     */  
    @GetMapping("/{id}")  
    public Student getStudentByID(@PathVariable Long id) {  
        return students.stream()  
                .filter(student -> student.getId().equals(id))  
                .findFirst()  
                .orElse(null);  
    }  
  
    /**  
     * 创建学生  
     * @param student  
     * @return  
     */  
    @PostMapping  
    public Student createStudent(@RequestBody Student student) {  
        students.add(student);  
        return student;  
    }  
  
    /**  
     * 更新学生  
     * @param id  
     * @param student  
     * @return  
     */  
    @PutMapping("/{id}")  
    public Student updateStudent(@PathVariable Long id, @RequestBody Student student) {  
        Student existingStudent = getStudentByID(id);  
        if (existingStudent != null) {  
            existingStudent.setName(student.getName());  
            existingStudent.setAge(student.getAge());  
            return existingStudent;  
        } else {  
            return null;  
        }  
    }  
  
    /**  
     * 删除学生  
     * @param id  
     * @return  
     */  
    @DeleteMapping("/{id}")  
    public void deleteStudent(@PathVariable Long id) {  
        students.removeIf(student -> student.getId().equals(id));  
    }  
}

单元测试

package com.jkxiao.springbootweb;  
  
import org.junit.jupiter.api.MethodOrderer;  
import org.junit.jupiter.api.Order;  
import org.junit.jupiter.api.Test;  
import org.junit.jupiter.api.TestMethodOrder;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;  
import org.springframework.boot.test.context.SpringBootTest;  
import org.springframework.http.MediaType;  
import org.springframework.test.web.servlet.MockMvc;  
  
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;  
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;  
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;  
  
@SpringBootTest  
@AutoConfigureMockMvc  
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)  
class StudentControllerTest {  
  
    @Autowired  
    private MockMvc mockMvc;  
  
    @Order(1)  
    @Test  
    void createStudent() throws Exception {  
        String requestBody = "{\"id\":1,\"name\":jkxiao\",\"age\":20}";  
        mockMvc.perform(get("/students")  
                        .content(requestBody)  
                        .contentType(MediaType.APPLICATION_JSON))  
                .andExpect(status().isOk());  
    }  
  
    @Order(2)  
    @Test  
    void  getAllStudents() throws Exception {  
        mockMvc.perform(get("/students"))  
                .andExpect(status().isOk())  
                .andExpect(content().contentType(MediaType.APPLICATION_JSON));  
    }  
  
    @Order(3)  
    @Test  
    void getStudentByID() throws Exception{  
        mockMvc.perform(get("/students/1"))  
                .andExpect(status().isOk());  
    }  
  
    @Order(4)  
    @Test  
    void updateStudent() throws Exception{  
        String requestBody = "{\"name\":\"xiao\",\"age\":20}";  
        mockMvc.perform(put("/students/1")  
                .content(requestBody)  
                .contentType(MediaType.APPLICATION_JSON))  
                .andExpect(status().isOk());  
    }  
  
    @Order(5)  
    @Test  
    void deleteStudent() throws Exception{  
        mockMvc.perform(delete("/students/1"))  
                .andExpect(status().isOk());  
    }  
}

cURL 测试请求

  • 获取所有学生信息:
curl http://localhost:8080/students
  • 根据ID获取学生信息:
curl http://localhost:8080/students/1
  • 创建学生:
curl -X POST -H "Content-Type: application/json" -d '{"id":1,"name":"jeiker","age":20}' http://localhost:8080/students
  • 更新学生信息:
curl -X PUT -H "Content-Type: application/json" -d '{"id":1,"name":"jeikerxiao","age":25}' http://localhost:8080/students/1
  • 删除学生:
curl -X DELETE http://localhost:8080/students/1

注意事项

  • RESTful规范:接口设计应符合RESTful规范,使用HTTP方法(GET、POST、PUT、DELETE)进行资源的增删改查操作。当然,也可以只使用 (GET、POST)
  • Lombok使用:在使用Lombok简化实体类编写时,需要在IDE中安装Lombok插件,并在项目中正确使用Lombok注解。
  • 单元测试控制方法执行顺序:在单元测试类中,通过@TestMethodOrder(MethodOrderer.OrderAnnotation.class) @Order(x) 注解来控制单元测试方法的执行顺序,标号小的执行优先级高。
转载自:https://juejin.cn/post/7368770335225692195
评论
请登录