如何为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
相关产品推荐
相关产品推荐

