网站开发表格,中国建设网官方网站洞庭湖治理,国家企业信息管理系统,昆明百度推广优化排名问题复现
在构建 Web 服务时#xff0c;我们一般都会对一个 HTTP 请求的 Body 内容进行校验#xff0c;例如我们来看这样一个案例及对应代码。当开发一个学籍管理系统时#xff0c;我们会提供了一个 API 接口去添加学生的相关信息#xff0c;其对象定义参考下面的代码我们一般都会对一个 HTTP 请求的 Body 内容进行校验例如我们来看这样一个案例及对应代码。当开发一个学籍管理系统时我们会提供了一个 API 接口去添加学生的相关信息其对象定义参考下面的代码import lombok.Data;
import javax.validation.constraints.Size;
Data
public class Student {Size(min 1, max 10)private String name;private short age;
}如上代码所示我们想针对学生的姓名进行一个判断不能为空并且长度为1-10。然后我们以下面的 JSON Body 做测试{name: ,age: 10,phone: {number:12306}
}测试结果符合我们的预期但是假设更进一步用下面的 JSON Body去除 name 字段做测试呢{age: 10,phone: {number:12306}
}我们会发现校验失败了。这结果难免让我们有一些惊讶也倍感困惑Size(min 1, max 10) 都已经要求最小长度为 1 了难道还只能约束空字符串即“”不能约束 null?
案例分析
如果我们稍微留心点的话就会发现其实 Size 的 Javadoc 已经明确了这种情况参考下图 如图所示“null elements are considered valid” 很好地解释了约束不住 null 的原因。当然纸上得来终觉浅我们还需要从源码级别解读下 Size 的校验过程。这里我们找到了完成 Size 约束的执行方法参考 SizeValidatorForCharSequence#isValid 方法public boolean isValid(CharSequence charSequence, ConstraintValidatorContext constraintValidatorContext) {if ( charSequence null ) {return true;}int length charSequence.length();return length min length max;
}如代码所示当字符串为 null 时直接通过了校验而不会做任何进一步的约束检查。
问题修正
关于这个问题的修正其实很简单我们可以使用其他的注解NotNull 或 NotEmpty来加强约束修正代码如下NotEmpty
Size(min 1, max 10)
private String name;完成代码修改后重新测试你就会发现约束已经完全满足我们的需求了。