今天在测试在测试项目的时候,报了个错误给我,看了一下日志,居然锁表了
就非常的慌张,从来没碰到过,错误日志是这样的
后来仔细看了一下代码,发现是前端没有传这个参数,导致删除出现错误,进而出现死锁现状。为什么没传参导致删除出现死锁这个问题因本人刚参加工作,会的不多,找不出来原因,只能暂时搁置。但我可以防止出现因为没有参数而出现的此类问题,由此引出了本篇文章,代码中的逻辑性校验。
首先是我们在什么情况下需要添加校验:
1.一般来说在正常的前端调用接口进行查询,删除时,用到了某些条件,那么这些条件是需要添加非空校验的。
2.在添加修改的时候,对于那些必填字段,例如用户添加姓名,修改信息时传参的id,这种就必须添加非空校验。
3.还有就是在方法内查询某些数据的时候用于填充或者用于查询其他数据的时候,这种查询出来的数据页需要添加校验。
以上三点是我讨教同事,总结的一些场景,可能不全,但适用于一般场景。接下来就说一下如何进行校验。
首先是前端调用接口传参的校验。这种一般可以在接受参数的类上添加注解例如:
非空注解:
@NotBlank
@NotNUll
长度校验注解:
@Length
@Max
@Min
等等。
要想使注解生效就需要再接口参数前添加注解:
@Validated(value = {InsertClass.insert.class})
使用这些注解的时候可以添加group分组,按照业务场景,进行不同的校验例如:
@Length(max = 120, message = "供应商名称最长1000个字", groups = {insert.class, update.class})
这种的意思是只有在@Validated注解中添加了了insert和update这两种值的方法中注解才能生效。
这种可以保证传入参数没有问题。
需要注意的是,在使用注解的过程中,如果存在实体A中定义另一个实体B的情况,想要B中的注解生效,就需要在定义B的代码上添加注解
@Valid
还有一中方法就是在方法内部添加校验工具,在刚进入方法的时候进行校验,这样也可以达到同样的效果,甚至还能自定义一些规则校验。下面是我同事写的一个校验工具,主要 用来校验数据是否非空和是否为真的一些方法:
public class ParameterCheck {
public static void notNull(Object obj, String msg) {
if(obj == null){
throw new ServiceException(msg);
}
}
public static void notBlank(String str, String msg) {
if(StringUtils.isBlank(str)){
throw new ServiceException(msg);
}
}
public static void notEmpty(String str, String msg) {
if(StringUtils.isEmpty(str)){
throw new ServiceException(msg);
}
}
public static void notEmpty(Collection<?> c, String msg) {
if(CollectionUtils.isEmpty(c)){
throw new ServiceException(msg);
}
}
public static void isTrue(Boolean bool, String msg){
if (!BooleanUtils.isTrue(bool)) {
throw new ServiceException(msg);
}
}
public static void isFalse(Boolean bool, String msg){
if (!BooleanUtils.isFalse(bool)) {
throw new ServiceException(msg);
}
}
}
当然你也可以使用自带的或者别的工具包,方式随意,只要记得添加校验即可。
这篇文章的主要目的是为了提醒作者本人要牢记添加校验这件事情,尤其是在逻辑复杂的代码中,因为没有加校验,在一天内发生了不下五次的空指针问题,甚至还出现了上文的锁表。同时也希望看到这篇文章的,想我一样刚工作一段时间或者马上毕业的同学们。一定要注意校验问题。