在平时的开发过程中,我们难免会对参数的数据类型进行校验。处理的方法也有很多种。
①:实现 RequestBodyAdvice里面的方法,可以通过IO流的方式进行处理,在请求之前进行操作。
②:通过annotation自定义注解进行处理。
③:通过Json反序列化进行处理。
④:通过全局校验类来处理。
总之方法有很多,那么此文章为大家讲解的是第③种,通过Json反序列化的时候进行校验处理
一,情景复现
比如在这里,我给priorityFlag给的是Integer类型,如图~~~·
但其实,我用postman测的时候,结果并非所预期的。
我请求体中 priority_flag给了一个6.5,结果创建成功了,且给我展示成了6,而且还 “操作成功" ,我实体类中给的明明是Integer,并没有给浮点型~~~这一顿操作有点凌乱啊~
原因是:当我们给浮点的时候,他在requestbody前就已经对浮点进行了转换,所以导致了这种情况的发生,这里打了个debug可以看一下
二、解决方法
其实校验的方法有很多种,我们这里就使用JsonDeserialize,Json反序列化的时候进行处理~
创建一个用于校验的class类,继承JsonDeserializer
package com.fitmgr.resourcecenter.common.validator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fitmgr.resourcecenter.common.constant.MessageConstant;
import com.fitmgr.resourcecenter.exceptions.IllegalArgsException;
import java.io.IOException;
public class IntegerValidator extends JsonDeserializer<Integer> {
@Override
public Integer deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
String msg = jsonParser.getCurrentName();//获取字段的名称(可以不用,具体看业务)
if(jsonParser.getFloatValue() > jsonParser.getIntValue()){//用浮点和整点去判断比较
throw new IllegalArgsException(msg+":"+MessageConstant.INVALID_PARAMETER_TYPE);//错误则抛出异常提示
}
return jsonParser.readValuesAs(Integer.class).next();//正确则通过,
}
}
写完这个类后,然后在我们需要进行校验的字段上加上这个注解并引用~
引用完成之后,我们就去开开心心的启项目~
启动之后,我们再去访问,结果会发现,达到了我们想要得效果,这次请求一个6.5不通过,直接抛出异常处理!!!皆大欢喜~~~
至此:Integer校验浮点型的就已经完成了。
三、额外延申
还有的情景是 实体类给的是Boolean 但是可以传数值型,这种情况处理方法也是一样的。
public class BooleanValidator extends JsonDeserializer<Boolean> {
@Override
public Boolean deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
return jsonParser.getBooleanValue() ? true : false;
}
}
Boolean类型的只会返回 true 或 false,我们直接获取出他的BooleanValue值,直接return回去,其余的值我们一律给他异常处理
四、温馨提示:
该方法只适合于后台的校验,前台直接在页面进行操作,具体的操作看具体项目的业务需求场景!
感谢您阅读此文章!
如有不懂的,欢迎大家一起讨论学习!