解决springboot静态内部类非空校验无效的问题

日常项目中,偶尔会使用到静态内部类。平时对字段做非空校验时,一般会使用javax的注解,如:

java 复制代码
@NotNull(message = "xxx")

如何对静态内部类中的字段做非空校验呢?我是这样写的:

java 复制代码
package cn.uni.boot.module.business.controller.app.finance.verification.vo;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

@Data
public class AppVerificationSubmitReqVo {

		// ...

    @Schema(description = "选择商品")
    @NotNull(message = "商品不能为空")
    private ProductInfo product;

        @Data
 		@Valid
    public static class ProductInfo{

        @Schema(description = "xx商品id")
        @NotNull(message = "xx商品id不能为空")
        private Long bankProductId;

        @Schema(description = "xx商品id")
        private Long cProductId;

    }

}

然后发现实际运行时,静态内部类中的字段并没有被成功校验,如'bankProductId'为null时依然可以通过。

查阅相关资料,发现:

@Valid 是用于「触发级联校验」的注解,它必须加在引用嵌套对象的字段上,而不是加在类定义上。

Bean Validation(如 Hibernate Validator)不会读取目标类上的 @Valid 注解来决定是否校验它 ------ 它只看父对象中引用该对象的字段是否标注了 @Valid。

可以把 @Valid 想象成一个"检查许可":

控制器说:"我要校验 AppVerificationSubmitReqVo。"

校验器检查它的字段:

codeId → 有 @NotNull → 检查。

product → 是一个对象 → 看看这个字段有没有 @Valid?

有 → 好,进去检查 ProductInfo 里面的约束。

没有 → 跳过,不管里面写了什么 @NotNull。

所以,@Valid 必须写在字段上,这是规范,不是可选项。

纠正:

java 复制代码
    @Valid // 改到这里
    @Schema(description = "选择商品")
    @NotNull(message = "商品不能为空")
    private ProductInfo product;

    @Data
    public static class ProductInfo{

        @Schema(description = "xxx商品id")
        @NotNull(message = "xxx商品id不能为空")
        private Long bankProductId;

        @Schema(description = "xxx商品id")
        private Long cProductId;

    }
相关推荐
需要8261 分钟前
MySQL MVCC 与事务隔离级别:从一条 update 看版本链
java·数据库·spring boot·mysql·spring cloud
Memory_荒年1 分钟前
订单超时未支付?从“定时扫库”一步步到最终形态
java·后端
RuoyiOffice8 分钟前
SpringBoot3 企业薪酬核算:考勤、绩效与薪资规则如何算出一张可解释的工资单
spring boot·vue3·规则引擎·hrm·ruoyi office·薪酬核算·薪资试算
卷无止境1 小时前
便宜模型和贵模型到底差在哪儿?一份关于Claude与GPT分级体系的深度梳理
后端·python
hai_android1 小时前
LruCache 图片浏览器内存缓存
android·java·kotlin
玩美移动1 小时前
AI Skin Analysis API 技术解析:文件上传、异步任务与结果读取
java·人工智能·python
我是小白呀1 小时前
19-Temporal项目实战:将客户开通流程迁移到持久执行架构
java·开发语言·人工智能·架构·workflow
步行cgn1 小时前
Spring 负责注入的注解详解
java·sql·spring
摇滚侠1 小时前
《On Java 中文版 基础卷》阅读笔记 安装 Java 和本书示例 02
java·开发语言·笔记
阿狗童鞋1 小时前
SpringBoot微服务实战指南
spring boot·后端·微服务