Java开发每日复盘2018_0510
今天来给大家分享一下
「服务端开发相关的,一条重要的原则」。
即:「不要相信前端传过来的数据」
不要相信前端传过来的数据,意思并不是说前端传过来的数据一定不好一定有问题,
而是说,对于前端传过来的任何数据,都要先做校验操作,校验通过后,再对其进行相关处理来使用该数据。
这样可以避免很多,不必要的异常被抛出。
那么「不要相信前端传过来的数据」,换句话说,则是「尽量要前端少传递数据」。
那么校验操作具体要怎么做呢?
方案一:
在每一个需要做校验判断的函数体,处理接收到传进来的数据之前,增加判断语句。
如:
public void setA(A a) {
if(a == null) {
throw new RuntimeException("a不能为空");
}
}
方案二:
在SpringBoot中,加入了「Hibernate Validatoe」依赖,用于做「Bean Validation」校验(Java规范JSR303)。
如:
「Bean Validation 注解」(常用)
@Null
(验证对象是否为空)
(可验证 任何 类型)
@NotNull
(验证对象是否为非空)
(可验证 任何 类型)
@Min
(验证 Number 和 String 对象是否大于等于指定的值)
(可验证 数值 类型)
@Max
(验证 Number 和 String 对象是否小于等于指定的值)
(可验证 数值 类型)
@Size
(验证对象(Array,Collection,Map,String)长度是否在给定的范围之内)
(可验证 集合/Map/List 类型)
@Past
(验证 Date 和 Calendar 对像是否在当前时间之前)
(可验证 日期 类型)
@Future
(验证 Date 和 Calendar 对象是否在当前时间之后)
(可验证 日期 类型)
@AssertTrue
(验证 Boolean 对象是否为 true)
(可验证 布尔 类型)
@AssertFalse
(验证 Boolean 对象是否为 false)
(可验证 布尔 类型)
@Valid
(级联验证注解)
注解位置:
「成员变量前面」
如:
@NotNULL int a = 0;
「方法上方」
如:
@NotNull
private int a() {}
用于验证该方法的返回值。
校验结果处理:
方案一:
Public XX xxx(@Validated @RequestBody A a){}
(若校验不通过,则接口直接返回400异常,不执行该方法体)
方案二:
Public XX xxx(@Validated @RequedtBody A a, BindingResult result){
if (result.hasError()) {
//此处自行处理校验不通过情况
}
}
(即使校验不通过,也会进入方法体,执行该方法。校验结果从result参数传入,由方法体内代码自行处理)
-- zeroOS 复盘于 2018/5/10