以下是基于最新技术栈的Spring Boot REST API开发实操指南,涵盖从环境搭建到生产部署的全流程:
文章以 “现代化 REST API 开发的全生命周期实践” 为核心,采用 “技术演进 - 架构设计 - 工程实现 - 生产化落地” 的四层递进结构。开篇通过对比 Spring Boot 2.x 与 3.x 在 REST API 开发上的差异,突出 3.x 版本 RestClient、GraalVM 原生镜像、Micrometer 增强等新特性带来的开发范式升级,并结合电商平台高并发场景案例,引出 “如何构建兼具技术先进性与工程实用性的 REST API” 这一核心问题。
核心依赖:
开发工具:
# 使用Spring Initializr快速创建项目
curl https://start.spring.io/starter.tgz -d dependencies=web,data-jpa,security,validation,actuator,openapi -d javaVersion=17 -d packaging=jar -d name=rest-api-demo | tar -xzvf -
示例领域模型(用户管理系统):
// User.java (实体)
@Entity
@Table(name = "users")
@Getter @Setter @NoArgsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotBlank(message = "用户名不能为空")
@Size(min = 3, max = 50)
private String username;
@Email(message = "邮箱格式不正确")
private String email;
@JsonIgnore
@NotBlank
@Size(min = 8)
private String password;
@Enumerated(EnumType.STRING)
private Role role = Role.USER;
// 构造方法、自定义业务方法
}
// UserDTO.java (数据传输对象)
@Data @Builder
public class UserDTO {
private Long id;
private String username;
private String email;
private Role role;
}
// UserController.java
@RestController
@RequestMapping("/api/v1/users")
@RequiredArgsConstructor
@Tag(name = "用户管理", description = "用户CRUD操作")
public class UserController {
private final UserService userService;
@PostMapping
@Operation(summary = "创建用户")
public ResponseEntity<UserDTO> createUser(@Valid @RequestBody CreateUserRequest request) {
UserDTO user = userService.createUser(request);
return ResponseEntity.created(URI.create("/api/v1/users/" + user.getId())).body(user);
}
@GetMapping("/{id}")
@Operation(summary = "根据ID获取用户")
public ResponseEntity<UserDTO> getUserById(@PathVariable Long id) {
return ResponseEntity.ok(userService.getUserById(id));
}
@PutMapping("/{id}")
@Operation(summary = "更新用户信息")
public ResponseEntity<UserDTO> updateUser(@PathVariable Long id, @Valid @RequestBody UpdateUserRequest request) {
return ResponseEntity.ok(userService.updateUser(id, request));
}
@DeleteMapping("/{id}")
@Operation(summary = "删除用户")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
userService.deleteUser(id);
return ResponseEntity.noContent().build();
}
// 分页查询、条件查询等方法
}
// ReactiveUserController.java (WebFlux响应式API)
@RestController
@RequestMapping("/api/v2/users")
@RequiredArgsConstructor
public class ReactiveUserController {
private final ReactiveUserService userService;
@GetMapping
public Flux<UserDTO> getAllUsers() {
return userService.getAllUsers();
}
@PostMapping
public Mono<ResponseEntity<UserDTO>> createUser(@Valid @RequestBody Mono<UserDTO> userDtoMono) {
return userDtoMono.flatMap(userService::createUser)
.map(savedUser -> ResponseEntity.created(URI.create("/api/v2/users/" + savedUser.getId())).body(savedUser));
}
}
JWT认证配置:
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {
private final JwtAuthenticationFilter jwtAuthFilter;
private final AuthenticationProvider authenticationProvider;
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeHttpRequests()
.requestMatchers("/api/v1/auth/**").permitAll()
.requestMatchers(HttpMethod.GET, "/api/v1/users/**").hasAnyRole("USER", "ADMIN")
.requestMatchers(HttpMethod.POST, "/api/v1/users").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authenticationProvider(authenticationProvider)
.addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class);
return http.build();
}
}
自定义SQL查询示例:
// UserRepository.java
@Repository
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
// 派生查询方法
Optional<User> findByEmail(String email);
// 自定义分页查询
@Query("SELECT u FROM User u WHERE u.username LIKE %:keyword%")
Page<User> searchByUsername(@Param("keyword") String keyword, Pageable pageable);
// 原生SQL查询
@Modifying
@Query(value = "UPDATE users SET role = :role WHERE id = :id", nativeQuery = true)
void updateUserRole(@Param("id") Long id, @Param("role") String role);
}
Swagger UI访问地址:
http://localhost:8080/swagger-ui/index.html
集成测试示例:
@SpringBootTest
@AutoConfigureMockMvc
class UserControllerIntegrationTest {
@Autowired private MockMvc mockMvc;
@Autowired private ObjectMapper objectMapper;
@Test
void givenValidUser_whenCreateUser_thenReturnCreated() throws Exception {
UserDTO userDTO = UserDTO.builder()
.username("testuser")
.email("test@example.com")
.password("Password123!")
.build();
mockMvc.perform(post("/api/v1/users")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(userDTO)))
.andExpect(status().isCreated())
.andExpect(jsonPath("$.username").value("testuser"));
}
}
Dockerfile示例:
# 基础镜像
FROM eclipse-temurin:17-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
Kubernetes部署清单:
apiVersion: apps/v1
kind: Deployment
metadata:
name: rest-api-demo
spec:
replicas: 3
selector:
matchLabels:
app: rest-api-demo
template:
metadata:
labels:
app: rest-api-demo
spec:
containers:
- name: rest-api-demo
image: your-registry/rest-api-demo:v1.0.0
ports:
- containerPort: 8080
env:
- name: SPRING_DATASOURCE_URL
valueFrom:
secretKeyRef:
name: db-secret
key: url
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "1024Mi"
cpu: "500m"
关键配置:
# application.yml
spring:
datasource:
hikari:
maximum-pool-size: 10
connection-timeout: 30000
idle-timeout: 300000
jpa:
properties:
hibernate:
generate_statistics: true
order_inserts: true
order_updates: true
batch_size: 50
management:
endpoints:
web:
exposure:
include: "*"
metrics:
export:
prometheus:
enabled: true
/api/v1
)或请求头实现@RestControllerAdvice
)@Transactional
注解+传播行为配置通过以上步骤,你可以构建一个具备生产级质量的Spring Boot REST API服务,满足高性能、高可用和可扩展的企业级需求。
Spring Boot,REST API, 接口开发,实战指南,Spring Boot 框架,API 设计,RESTful, 接口实战,Spring Boot 开发,API 接口,Web 服务,Spring Boot 教程,微服务,后端开发,Java 开发
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。