属性存在检查仅为校验起点,需叠加值合法性判断、嵌套Bean递归验证及注解驱动的业务规则约束,涵盖字段声明、getter可用性、空值与语义校验、递归深度控制及注解参数提取执行。

直接通过属性存在检查本身无法完成深层校验,它只是校验链条的第一步——确认字段是否定义、是否可访问。真正的深层校验需要在此基础上叠加值合法性判断、嵌套对象递归验证和业务规则约束。
先确认属性是否存在且可读
用反射检查字段是否声明,再验证对应 getter 是否存在且可调用,避免后续取值时报 NoSuchMethodException 或 IllegalAccessException:
- 调用
Class.getDeclaredField(fieldName)确认字段已定义(含 private 字段) - 用
Class.getMethod("get" + capitalized, new Class[0])检查 getter 是否公开可用 - 若字段无 getter(如只写属性),需改用
Field.get(object)并设setAccessible(true)
对非空属性做值级校验
属性存在 ≠ 值合法。必须结合类型与语义进一步判断:
- 字符串:判 null 后再用
StringUtils.isBlank()排除纯空格 - 数值类型:除判 null 外,还需按业务限制校验范围(如年龄 ≥ 0 且 ≤ 150)
- 集合/数组:判 null 后检查 size > 0(若要求非空集合)
- 日期类型:判 null 后验证是否在合理区间(如出生日期不晚于当前日)
递归校验嵌套 Bean 属性
当字段类型是另一个 Bean,不能只检查该字段是否非 null,还要对其内部属性逐层展开:
- 遇到
@Valid标记的字段,在取值后立即调用同一套校验逻辑递归执行 - 对 List/Set 中的每个元素,若元素类型为 Bean,也需单独校验(需配合泛型擦除后的实际类型推断)
- 设置递归深度上限(如 5 层),防止循环引用导致栈溢出
结合注解驱动的约束规则
单纯靠反射遍历字段容易遗漏语义约束。应统一识别并执行标准注解:
- 扫描字段上的
@NotNull、@NotBlank、@Min、@Pattern等注解 - 提取注解参数(如
@Size(min=2, max=20)),用于动态构造校验条件 - 将注解规则与手动校验逻辑融合:先走注解规则,失败时再回退到自定义扩展逻辑

















