最近出了好几次线上问题,还是太不细心了,后端还是需要严格的测试和验证,否则稍有遗漏就可能出严重的线上问题,记录下最近出现的问题,也希望以后问题能越来越少。
1、Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 7####### The error may involve defaultParameterMap####### The error occurred while setting parameters####### SQL: insert into
这里是因为用了批量插入,mybatis中循环foreach循环list进行插入,但是忘记对list进行非空判断,导致list为空时插库失败。
空指针是很常见的错误,很低级也很不应该,所以以后应该尽量最好非空判断
String 类型的非空判断:StringUtils.isEmpty(str)
List类型的非空判断CollectionUtils.isEmpty()
2、HTTP Status 500 – Internal Server Error
报500是因为程序异常直接抛出了,要具体看下后端具体报错,我这里是因为在handleException,统一处理异常时犯了个低级错误
if (e instanceof ErrorCodeException) {
return new RetResult(((ErrorCodeException) e).errorCode, e.getMessage());
}
if (e instanceof IllegalParamException) {
return new RetResult(((ErrorCodeException) e).errorCode, e.getMessage());
}
ErrorCodeException是自定义的异常,IllegalParamException是另外一个包里的,我在修改时直接粘贴,没注意到结果导致类型转换异常,也是很低级的错误,写代码时尽量还是应该手打,复制粘贴很容易出错。
3、handleMethodArgumentNotValidException [Field error in object 'entity' on field 'abc': rejected value [null]
valid的非空校验,但是这里奇怪的是字段是传了的没问题,因为这个更新操作有一堆字段,后来经过case对比,发现是其中一个字段本来应该传string,前端传了[],结果导致后面几个字段校验都出了问题,这种部分参数错误很难发现,因为都没办法debug,只能多细心一些。
这个问题的具体原因是这个字段在前端展示是数组,传给后端是string,所以会做一个转换操作,但是前端判断只有在某几个产品的时候才会去做这个操作,这次新增了一个产品,前端这里加漏掉了,导致了这个问题的产生。在线下测试的时候就发现了这个问题,不过以为是数据问题,再加上报错很有诱导性。以后还是应该更细心一些,不管多小的问题都要找到原因,不然等上线了可能就是大问题。