解决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;

    }
相关推荐
大模型码小白14 小时前
JAVA 集合框架进阶:List 与 Set 的深度解析与实战
java·开发语言·人工智能·windows·语言模型·list·ai编程
IT_陈寒14 小时前
为什么我的JavaScript异步代码总是不按顺序执行?
前端·人工智能·后端
星栈15 小时前
Node 框架怎么选?Express、Koa、Egg、NestJS 场景化选型指南
后端·node.js
名字还没想好☜15 小时前
Go 的 time.Ticker 陷阱:定时任务里被忽略的内存泄漏与正确关闭
java·数据库·golang·go·定时器
锋行天下15 小时前
打造企业内部知识库系统RAG全栈项目
前端·后端·架构
音符犹如代码16 小时前
后端视角看 EventBus:发布订阅总线的原理、场景与用法
java·spring boot·guava
前端炒粉16 小时前
手撕小汇总
java·前端·javascript
码事漫谈16 小时前
Kimi K3 真实体验:全网评价整理,优缺点一次性说清楚
后端
Fanta丶16 小时前
16.Activiti8 SpringBoot3.X 部署与测试
后端
用户2080468045616 小时前
Python3 数据类型转换新手实战指南
后端