Spring Boot REST API 中的自定义类参数校验完整实践指南

夏宇吖_5822

夏宇吖_5822

2026-10-13

262人浏览

原创

Spring Boot REST API 中的自定义类参数校验完整实践指南

本文详解如何在 Spring REST Controller 中对 JSON 请求体(如 Search 类)进行精准、前置的字段级校验,确保非法字段名、空集合、缺失必填项等错误能及时捕获并返回清晰的 400 响应,避免因反序列化默认行为导致的静默失败。

本文详解如何在 spring rest controller 中对 json 请求体(如 `search` 类)进行精准、前置的字段级校验,确保非法字段名、空集合、缺失必填项等错误能及时捕获并返回清晰的 400 响应,避免因反序列化默认行为导致的静默失败。

在 Spring Boot 中,仅依赖 @Valid 注解本身并不能自动检测 JSON 中的非法字段名(如将 "select" 错写为 "seletc"),因为 Jackson 默认会忽略未知字段(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES = false)。但真正的校验重点在于:确保反序列化后的对象状态合法——例如 select 列表非空、filters 不为 null、每个 Filter 实例自身也满足其约束条件。这才是生产环境必须保障的核心校验目标。

✅ 正确配置校验注解(关键修正)

首先,移除冗余的 @Valid,改用语义更明确、约束更强的验证注解:

public class Search {

    @NotEmpty(message = "select 字段不能为空列表")
    private List<string> select = new ArrayList();

    @NotNull(message = "filters 字段不能为 null")
    @NotEmpty(message = "filters 列表不能为空")
    private List<filter> filters = new ArrayList(); // 注意:此处无需 @Valid —— 若 Filter 类含校验规则,@Valid 将在下一层生效

    // 构造函数、getter/setter 省略
}</filter></string>

? 说明:

  • @NotEmpty 同时校验 null 和空集合(size() == 0),比 @NotNull 更严格;
  • List<filter></filter> 本身不需 @Valid,但若 Filter 类中定义了 @NotBlank、@Min 等注解,则 @Valid 必须加在 filters 字段上(见下文);
  • @Valid 的作用是递归触发嵌套对象的校验,而非校验集合类型本身。

✅ Controller 层启用全局校验

确保控制器方法参数使用 @Valid 触发校验链,并配合 BindingResult 或全局异常处理器统一响应:

@RestController
public class SearchController {

    @PostMapping("/search")
    public ResponseEntity> results(
            @NotNull @PathVariable String id,
            @Valid @RequestBody Search search) { // ✅ @Valid + @RequestBody 是标准组合
        // 业务逻辑
        return ResponseEntity.ok("success");
    }
}

⚠️ 注意:@RequestBody 是必需的,它明确告知 Spring 该参数来自 JSON 请求体;@Valid 则启动 JSR-303 校验流程。

✅ 为嵌套对象(如 Filter)添加校验

若 Filter 类需校验其字段(如 field 非空、value 长度合规),则需在 Search.filters 上添加 @Valid,并在 Filter 中声明约束:

public class Filter {
    @NotBlank(message = "filter.field 不能为空")
    private String field;

    @Size(max = 100, message = "filter.value 长度不能超过 100")
    private String value;

    // 构造函数、getter/setter
}

// 对应地,Search 中:
@Valid // ✅ 启用对每个 Filter 实例的校验
@NotNull @NotEmpty
private List<filter> filters = new ArrayList();</filter>

✅ 全局异常处理(推荐实践)

为提升用户体验,建议统一捕获校验异常并返回结构化错误响应:

Spring Boot Actuator Analyzer
Spring Boot Actuator Analyzer

分析Spring Boot Actuator端点的安全性、健康检查、指标暴露及生产配置——审计信息、健康状态和自定义端点。

下载
@ControllerAdvice
public class ValidationExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<map string>> handleValidationErrors(
            MethodArgumentNotValidException ex) {
        Map<string string> errors = new HashMap();
        ex.getBindingResult().getAllErrors().forEach((error) -> {
            String fieldName = ((FieldError) error).getField();
            String errorMessage = error.getDefaultMessage();
            errors.put(fieldName, errorMessage);
        });
        return ResponseEntity.badRequest().body(errors);
    }
}</string></map>

调用示例(非法请求):

POST /search?id=123
{
  "select": [],
  "filters": [{}]
}

→ 返回 400 Bad Request:

{
  "select": "select 字段不能为空列表",
  "filters[0].field": "filter.field 不能为空"
}

? 关于“检测未知字段”的补充说明

如需严格拒绝含未知字段的 JSON(如 "seletc"),需显式开启 Jackson 配置:

# application.yml
spring:
  jackson:
    deserialization:
      fail-on-unknown-properties: true

但请注意:此配置会使整个应用所有 JSON 反序列化均失败于未知字段,可能影响兼容性。更推荐的做法是依靠严谨的 DTO 设计 + 充分的字段级校验,而非依赖未知字段拦截——后者属于防御性设计,前者才是契约驱动的正向保障。

总结:校验的核心在于明确约束语义(@NotEmpty > @NotNull)、合理使用 @Valid 触发嵌套校验、配合 @RequestBody 和全局异常处理器。这样即可在 Spring 生态中构建健壮、可维护、用户友好的 REST 参数校验体系。

大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

spring boot rest api

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
spring boot框架优点
spring boot框架优点

spring boot框架的优点有简化配置、快速开发、内嵌服务器、微服务支持、自动化测试和生态系统支持。本专题为大家提供spring boot相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.05

611

5

spring框架有哪些
spring框架有哪些

spring框架有Spring Core、Spring MVC、Spring Data、Spring Security、Spring AOP和Spring Boot。详细介绍:1、Spring Core,通过将对象的创建和依赖关系的管理交给容器来实现,从而降低了组件之间的耦合度;2、Spring MVC,提供基于模型-视图-控制器的架构,用于开发灵活和可扩展的Web应用程序等。

2023.10.12

1455

7

Java Spring Boot开发
Java Spring Boot开发

本专题围绕 Java 主流开发框架 Spring Boot 展开,系统讲解依赖注入、配置管理、数据访问、RESTful API、微服务架构与安全认证等核心知识,并通过电商平台、博客系统与企业管理系统等项目实战,帮助学员掌握使用 Spring Boot 快速开发高效、稳定的企业级应用。

2025.08.19

4686

10

Java Spring Boot 4更新教程_Java Spring Boot 4有哪些新特性
Java Spring Boot 4更新教程_Java Spring Boot 4有哪些新特性

Spring Boot 是一个基于 Spring 框架的 Java 开发框架,它通过 约定优于配置的原则,大幅简化了 Spring 应用的初始搭建、配置和开发过程,让开发者可以快速构建独立的、生产级别的 Spring 应用,无需繁琐的样板配置,通常集成嵌入式服务器(如 Tomcat),提供“开箱即用”的体验,是构建微服务和 Web 应用的流行工具。

2025.12.22

436

5

Java Spring Boot 微服务实战
Java Spring Boot 微服务实战

本专题深入讲解 Java Spring Boot 在微服务架构中的应用,内容涵盖服务注册与发现、REST API开发、配置中心、负载均衡、熔断与限流、日志与监控。通过实际项目案例(如电商订单系统),帮助开发者掌握 从单体应用迁移到高可用微服务系统的完整流程与实战能力。

2025.12.24

640

18

Spring Boot企业级开发与MyBatis Plus实战
Spring Boot企业级开发与MyBatis Plus实战

本专题面向 Java 后端开发者,系统讲解如何基于 Spring Boot 与 MyBatis Plus 构建高效、规范的企业级应用。内容涵盖项目架构设计、数据访问层封装、通用 CRUD 实现、分页与条件查询、代码生成器以及常见性能优化方案。通过完整实战案例,帮助开发者提升后端开发效率,减少重复代码,快速交付稳定可维护的业务系统。

2026.02.11

385

24

Kotlin协程编程与Spring Boot集成实践
Kotlin协程编程与Spring Boot集成实践

本专题围绕 Kotlin 协程机制展开,深入讲解挂起函数、协程作用域、结构化并发与异常处理机制,并结合 Spring Boot 展示协程在后端开发中的实际应用。内容涵盖异步接口设计、数据库调用优化、线程资源管理以及性能调优策略,帮助开发者构建更加简洁高效的 Kotlin 后端服务架构。

2026.02.12

351

18

Spring Boot 项目开发与实战
Spring Boot 项目开发与实战

以 Spring Boot 为核心,讲解项目的快速初始化(Spring Initializr)、自动配置与 Starter 依赖原理、配置文件(application.yml)多环境管理、RESTful API 接口开发与参数校验、MyBatis / MyBatis-Plus / Spring Data JPA 数据持久层整合、Redis 缓存集成、统一异常处理与全局响应封装、Swagger / Knife4j 接口文档生成,以及 Ma

2026.04.17

326

21

Java Spring Boot多租户架构设计与数据隔离实战
Java Spring Boot多租户架构设计与数据隔离实战

本专题聚焦 Java 企业级系统中的多租户架构设计,讲解数据隔离策略、租户路由机制、数据库分库分表方案以及权限控制模型。通过真实 SaaS 系统案例,帮助开发者构建可扩展的多租户应用架构。

2026.06.29

376

13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Spring Boot 官方快速入门指南
Spring Boot 官方快速入门指南

共0课时 | 0人学习

Spring Boot 官方参考文档
Spring Boot 官方参考文档

共0课时 | 0人学习

尚硅谷新版SpringBoot3教程
尚硅谷新版SpringBoot3教程

共0课时 | 0人学习