Spring Boot 入门实战(二):用户注册接口设计(Controller + DTO + Validation)

一、前言

在第一篇(Spring Boot 入门实战(一):项目创建与运行机制详解)中,我们完成了:

复制代码
Spring Boot 项目创建
→ pom.xml 依赖理解
→ application.yml 配置
→ Controller 基本使用

但此时的项目还只是一个"能启动的服务",并没有真正的业务能力。

本篇开始,我们进入第一个真实接口开发:用户注册接口

二、目标:实现一个注册接口

目标接口:

复制代码
POST /user/register

功能:

复制代码
接收用户名和密码 → 校验参数 → 返回注册结果

三、接口设计思路

一个标准后端接口,一般分三步:

复制代码
1. 接收请求(Controller)
2. 承载数据(DTO)
3. 参数校验(Validation)

四、DTO 设计(参数对象)

新建:

复制代码
dto/UserRegisterDTO.java

代码如下:

java 复制代码
package org.example.arkbackend.dto;

import jakarta.validation.constraints.NotBlank;
import lombok.Data;

@Data
public class UserRegisterDTO {

    @NotBlank(message = "用户名不能为空")
    private String username;

    @NotBlank(message = "密码不能为空")
    private String password;
}

解释

复制代码
@Data → 自动生成 getter / setter
@NotBlank → 定义校验规则(不能为空字符串)

五、Controller 实现(接口入口)

新建:

复制代码
UserController.java

代码如下:

java 复制代码
package org.example.arkbackend;

import jakarta.validation.Valid;
import org.example.arkbackend.dto.UserRegisterDTO;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/user")
public class UserController {

    @PostMapping("/register")
    public String register(@Valid @RequestBody UserRegisterDTO dto) {

        System.out.println("username: " + dto.getUsername());
        System.out.println("password: " + dto.getPassword());

        return "注册成功,用户名:" + dto.getUsername();
    }
}

六、核心注解说明(非常重要)

1. @RestController

复制代码
声明当前类为接口控制器,返回数据而不是页面

2. @RequestMapping

复制代码
定义接口前缀路径,例如 /user

3. @PostMapping

复制代码
定义 POST 请求接口,例如 /register

4. @RequestBody

复制代码
将请求体中的 JSON 转换为 Java 对象

5. @Valid

复制代码
触发参数校验

6. @NotBlank(在 DTO 中)

复制代码
定义校验规则(不能为空字符串)

⭐ 注解关系总结

复制代码
@RequestBody → 转换数据
@NotBlank → 定义规则
@Valid → 触发规则

七、接口测试(IDEA HTTP / Postman)

请求

复制代码
POST http://localhost:8080/user/register
Content-Type: application/json

{
  "username": "test",
  "password": "123456"
}

正常返回

复制代码
注册成功,用户名:test

参数错误示例

复制代码
{
  "username": "",
  "password": ""
}

返回:

复制代码
400 Bad Request

说明:

复制代码
校验未通过,请求被拦截

八、一次请求的完整流程

复制代码
客户端发送 JSON
→ @RequestBody 转换为 DTO
→ @Valid 触发校验
→ 校验通过 → 进入 Controller 方法
→ 返回响应结果

九、常见踩坑总结

❌ 1. 没加 @Valid

复制代码
DTO 上写了 @NotBlank,但不会生效

❌ 2. JSON 写到 Header

复制代码
会报:invalid character '{'

❌ 3. 返回 empty

复制代码
原因:方法没有返回值(void)或项目未重启

❌ 4. 修改代码未重启

复制代码
代码改了,但接口仍是旧逻辑

十、命名规范建议

复制代码
推荐使用统一简洁命名:
username / password

说明:

复制代码
避免 userName / passWord 等不规范写法

十一、一句话总结

通过 Controller + DTO + Validation,可以快速构建一个具备参数接收和校验能力的接口,是后端开发的最小闭环

十二、Controller 常用注解详解(接口开发核心)

在 Spring Boot 中,接口开发主要依赖一组注解完成请求映射和参数解析。

本节对使用到的核心注解进行统一说明。

1. @RestController

java 复制代码
@RestController
public class UserController {
}
作用
复制代码
声明当前类是一个接口控制器(Controller),并且返回数据而不是页面
本质
复制代码
@RestController = @Controller + @ResponseBody

2. @RequestMapping

java 复制代码
@RequestMapping("/user")
作用
复制代码
定义接口的统一路径前缀
示例
复制代码
类上:/user
方法上:/register

最终路径:/user/register

3. @PostMapping / @GetMapping

java 复制代码
@PostMapping("/register")
@GetMapping("/info")
作用
复制代码
指定 HTTP 请求方式 + 路径
等价写法
java 复制代码
@RequestMapping(value = "/register", method = RequestMethod.POST)

4. @RequestBody

java 复制代码
public String register(@RequestBody UserRegisterDTO dto)
作用
复制代码
将请求体中的 JSON 数据转换为 Java 对象
说明
复制代码
适用于 POST / PUT 请求

5. @Valid

java 复制代码
public String register(@Valid @RequestBody UserRegisterDTO dto)
作用
复制代码
触发参数校验(结合 DTO 上的校验注解)
配合使用
java 复制代码
@NotBlank(message = "用户名不能为空")
private String username;

6. @RequestParam

java 复制代码
@GetMapping("/info")
public String getUser(@RequestParam String username)
作用
复制代码
接收 URL 参数(查询参数)
示例
java 复制代码
GET /user/info?username=test

7. @PathVariable

java 复制代码
@DeleteMapping("/delete/{id}")
public String delete(@PathVariable Long id)
作用
复制代码
从路径中提取参数
示例
复制代码
DELETE /user/delete/1

8. @NotBlank(DTO中)

java 复制代码
@NotBlank(message = "用户名不能为空")
private String username;
作用
复制代码
定义参数校验规则(不能为空字符串)

9. 常见注解关系总结

复制代码
@RestController:声明控制器
@RequestMapping:路径前缀
@PostMapping / GetMapping:请求类型
@RequestBody:接收JSON
@Valid:触发校验
@NotBlank:定义校验规则

10. 一句话总结

复制代码
Controller 通过注解完成请求映射、参数解析和校验,是后端接口的核心入口层

tips:

Spring Boot 接口设计进阶:POST / PUT / DELETE 的本质区别与工程实践

下一篇:

Spring Boot 实战(三):Service 层设计(从"能跑"到"像项目")

Service 层(业务逻辑拆分)

将接口从:Service 层(业务逻辑拆分)

升级为:符合工程结构

相关推荐
A-Jie-Y3 小时前
JAVA框架-SpringBoot环境搭建指南
java·spring boot
深兰科技3 小时前
深兰科技与淡水河谷合作推进:矿区示范加速落地
java·人工智能·python·c#·scala·symfony·深兰科技
码界奇点3 小时前
基于Spring Boot的前后端分离商城系统设计与实现
java·spring boot·后端·java-ee·毕业设计·源代码管理
一叶飘零_sweeeet3 小时前
深度剖析:Java 并发三大量难题 —— 死锁、活锁、饥饿全解
java·死锁·活锁·饥饿
IT乐手4 小时前
java 对比分析对象是否有变化
android·java
云烟成雨TD4 小时前
Spring AI Alibaba 1.x 系列【18】Hook 接口和四大抽象类
java·人工智能·spring
Hachi被抢先注册了4 小时前
Docker学习记录
java·云原生·eureka
消失的旧时光-19434 小时前
Spring Boot 接口设计进阶:POST / PUT / DELETE 的本质区别与工程实践
spring boot·后端
MegaDataFlowers4 小时前
基于EasyCode插件的SpringBoot和Mybatis框架快速整合以及PostMan的使用
spring boot·mybatis·postman