You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为jsonschemapojo2生成类配置必填字段校验或实现Spring Boot字段校验

方案解答

1. JSON Schema层面配置规则(优先方案)

可以在原始JSON Schema层面直接指定必填和字段校验规则,无需修改自动生成的Java类,完全匹配你的需求。
你只需要调整生成类用的原始JSON Schema配置,新增required声明和minLength约束即可,示例如下:

{
  "type": "object",
  "required": ["b"],
  "properties": {
    "b": {
      "type": "string",
      "minLength": 1
    }
  }
}

在反序列化MongoDB返回的原始数据前,先用JSON Schema校验器(如com.networknt:json-schema-validator)对数据做前置校验,不满足规则直接抛出异常,再走反序列化逻辑即可,三种异常场景(字段不存在、值为null、值为空字符串)都会被拦截。

2. Spring Boot环境无侵入校验方案(无法调整Schema时可选)

不需要手写反射逻辑,利用Spring Data MongoDB的原生回调即可实现全局自动校验,无需修改业务代码:

  • 首先引入spring-boot-starter-validation依赖
  • 自定义校验逻辑和MongoDB查询回调,示例代码如下:
import org.springframework.stereotype.Component;
import org.springframework.data.mongodb.core.mapping.event.AfterConvertCallback;

// 校验工具类
@Component
public class AValidator {
    public void validateA(a target) {
        if (target == null || target.getB() == null || target.getB().isBlank()) {
            throw new IllegalArgumentException("字段b不能为空、空字符串,或字段不存在");
        }
    }
}

// MongoDB反序列化后自动触发校验
@Component
public class AAfterConvertCallback implements AfterConvertCallback<a> {
    private final AValidator aValidator;

    public AAfterConvertCallback(AValidator aValidator) {
        this.aValidator = aValidator;
    }

    @Override
    public a onAfterConvert(a entity, org.bson.Document document, String collection) {
        aValidator.validateA(entity);
        return entity;
    }
}

配置完成后,所有从MongoDB查询反序列化为a类的对象都会自动走校验逻辑,不符合要求直接抛异常。

3. 通用反射校验方案(无框架依赖时可选)

如果没有Spring环境,可以用反射写通用校验工具,示例如下:

import java.lang.reflect.Field;

public class ValidationUtils {
    public static void validateRequiredStringField(Object obj, String fieldName) throws Exception {
        if (obj == null) {
            throw new IllegalArgumentException("校验对象不能为空");
        }
        Field field = obj.getClass().getDeclaredField(fieldName);
        field.setAccessible(true);
        Object value = field.get(obj);
        if (value == null || ((String) value).isBlank()) {
            throw new IllegalArgumentException(String.format("字段%s不能为空、空字符串,或字段不存在", fieldName));
        }
    }
}

调用方式:ValidationUtils.validateRequiredStringField(aObj, "b");

内容的提问来源于stack exchange,提问作者Fernando

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 18:45:03