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 层(业务逻辑拆分)

升级为:符合工程结构

相关推荐
逻辑驱动的ken10 小时前
Java高频面试场景题25
java·开发语言·深度学习·面试·职场和发展
AI人工智能+电脑小能手11 小时前
【大白话说Java面试题】【Java基础篇】第32题:Java的异常处理机制是什么
java·开发语言·后端·面试
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ12 小时前
通过java后端代码来实现给word内容补充格式文本内容控件,以及 设置控件的标记和标题
java·c#·word
無限進步D13 小时前
Java 面向对象高级 接口
java·开发语言
逸Y 仙X14 小时前
文章二十七:ElasticSearch ES查询模板(Search Template)高效复用实战
java·大数据·数据库·elasticsearch·搜索引擎·全文检索
二哈赛车手14 小时前
新人笔记---Spring AI的Advisor以及其底层机制讲解(涉及源码),包含一些遇见的Spring AI的Advisor缺陷问题的解决方案
java·人工智能·spring boot·笔记·spring
AC赳赳老秦14 小时前
接口测试自动化:用 OpenClaw 对接 Postman,实现批量回归测试、测试报告自动生成与推送
java·人工智能·python·算法·elasticsearch·deepseek·openclaw
两年半的个人练习生^_^14 小时前
Java日志框架和使用、日志记录规范
java·开发语言·开发规范
pq21715 小时前
最简单的理解synchronized锁升级
java