一些在代码中踩过的坑,从来没遇到过的估计已经不是大头兵了。
前言
在我们日常coding中,很多时候我们都是把接口代码全部写完再进行测试,在我们检查代码的时候,常常很有信心检查了多遍以后,觉得自己的代码肯定没啥问题,逻辑很清晰、排版很整齐、公共方法抽的很好,很有信心的去调自己的接口,不料动不动一会500、一会400,就差报250~,其实我们常常的我以为,只是我以为,执行结果会教你做人,事实证明代码不需要只是看着好看的,还是需要看执行结果的,下面我分享一些日常会踩到坑的地方
八大常见bug
Top1 请求参数为空
常常听到,数据库明明有数据呀,我把sql粘出来再mysql执行也有数据呀,为什么我用mybatis执行sql就没数据呢。
POST请求,如参数为字符串,请求到后端接口只能有一个结果,那就是 parameter参数为NULL,影响行数也0,POST请求需要结合 RequestBody使用,所以POST请求的入参是放到body里面的。
Top2 StringUtils.isEmpty 判断对象为空
User user = User(new LambdaQueryWrapper<User>().eq(User::getUserId, userId)
if (!StringUtils.isEmpty(user))
复制代码
乍一看没啥问题,代码也没报错,判断user不为空,但是执行的时候往往就会有问题。
对象签名对于一般的属性处理代码很有用,这些代码通常处理字符串,但通常必须遍历对象,因为属性也可能是基本值对象。
Note: If the object is typed to String upfront, prefer hasLength(String) or hasText(String) instead.
Params:
str – the candidate object (possibly a String)
Since:
3.2.1
See Also:
hasLength(String), hasText(String)
public static boolean isEmpty(@Nullable Object str) {return (str == null || "".equals(str));
}复制代码
看源码的解释,通常是处理字符串,判断对象需要重写isEmpty方法。
Top3 sql if 函数判断
if(p.transport_fee =1,p.payable_amount,s.actual_goods_number * p.goods_price ) as payableAmount,
复制代码
正常情况下如果transport_fee =1 则会取p.payable_amount字段,反之则会取后面的运算结果,乍一看又没啥毛病。
但是 如果这个字段是NULL,那么就BBQ了,mysql if函数判断就不会判断到字段为NULL的数据。所以最好在创建这种需要逻辑判断的字段,设置默认值。
Top4 Mybatis plus lambda 表达式AND 和OR连用
其实我们sql想要的效果是这样
select
<include refid="baseColumnList"/>
from slaughter_batch_statementwhere
enable = 1and (slaughter_statement_no=#{dto.slaughterStatementNo
} or slaughter_statement_no is null)
复制代码
LambdaQueryWrapper 查询错误用法:
SlaughterBatchStatement slaughterBatchStatement = slaughterBatchStatementMapper.selectOne(new LambdaQueryWrapper<SlaughterBatchStatement>().eq(SlaughterBatchStatement::getSlaughterStatementNo, slaughterStatementNo).or().eq(SlaughterBatchStatement::getBatchNo,slaughterStatementNo));
复制代码
or().eq()的用法会在sql,and 条件后追加or,而不能 (supplier_bill_statement_no =‘xxxxxxx’ or supplier_bill_statement_no is null) 像这样用括号括起来,括号括起来和不括起来的条件判断完全不一样。
LambdaQueryWrapper or正确用法:
SlaughterBatchStatement slaughterBatchStatement = slaughterBatchStatementMapper.selectOne(new LambdaQueryWrapper<SlaughterBatchStatement>().eq(SlaughterBatchStatement::getEnable, 1).and(item -> item.eq(SlaughterBatchStatement::getSlaughterStatementNo, "xxxxx").or().eq(SlaughterBatchStatement::getSlaughterStatementNo, null)));复制代码
Top5 BigDecimal 保留两位小数
有时候做金额计算的时候,使用BigDecimal经常会在计算后保存两位小数。
BigDecimal receivableAmountNum = receivableFeeAmountNum.add(slaughterReceivableAmountNum).setScale(2, RoundingMode./HALF_UP/);
复制代码
你以为光代码设置保留两位小数就行了么,数据库对字段的设置也是需要加两位小数限制的。
如果你不设置,那么保存到库里面的数据依旧是四舍五入后的整数。
Top6 Spring中一个类调用另一个类Null指针
新建一个类,然后在另一个类去调用,创建了一个类,定义了方法。
错误调用方式:这是空指针的罪魁祸首
正确的调用方式:
Spring中直接new 出来的对象无法通过@Autowired 的方式注入到spring的Bean容器里面。
Top7 Bean. copyProperties 引发的问题
在开发的过程中,遇到DTO和VO之间的转换,为了避免写很多的get、set,通常会使用Bean. copyProperties对对象进行赋值转换。
SlaughterBatchStatementResVO slaughterBatchStatementResVO = new SlaughterBatchStatementResVO();
SlaughterBatchStatement slaughterBatchStatement = slaughterBatchStatementMapper.selectOne(new LambdaQueryWrapper<SlaughterBatchStatement>().eq(SlaughterBatchStatement::getSlaughterStatementNo, slaughterUpdateReqDTO.getSlaughterStatementNo()));
//对象进行copy
BeanCopyUtil.copyProperties(slaughterBatchStatement, slaughterBatchStatementResVO);复制代码
BeanCopyUtil.copyProperties 这里的copy属于浅拷贝,两个对象都指向同一个指针,所以在对其中一个对象属性进行修改时,由于指针都是一样,那么另外一个对象的属性也会更改,就会出现一些问题。
当然Bean的copy还有另外一种方式就是深拷贝,通过new新的对象进行copy
List<ReceivableFeeVO> receivableFeeResList = BeanCopyUtil.copyListProperties(slaughterUpdateReqDTO.getReceivableFees(), ReceivableFeeVO::new);
复制代码
可以通过继承BeanUtils重写Bean拷贝的工具类实现
Top8 List.contains Interger 无法匹配
@Data
public class SlaughterBatchExportRequestDTO {private List<String> slaughterBatchExportType;
}if (slaughterBatchExportRequestDTO.getSlaughterBatchExportType().contains(2)) {// ...
}
复制代码
有时候一不留神就手抖写错了,contains的入参是一个Object类型,所以入参数是任何类型都不报错,但是能不能匹配到又是另外一回事了。
List集合去匹配int类型是否存在,那结果可想而已永远不会进if判断。
总结
刚工作的时候经常会因为自己的粗心,出现一些比较低级的Bug,如今已经多少混成老油条了,所以去写更加高级的Bug了,总而言之写代码不光要逻辑思路正确,最关键的我认为还是细心,反复的review自己的代码,并且进行自测,如果还有更加常见的bug的欢迎评论区留言,踩坑踩的多了,填坑填的多了,慢慢就变成了路~
一些在代码中踩过的坑,从来没遇到过的估计已经不是大头兵了。相关推荐
- 机器学习中踩过的坑,如何让你变得更专业?
2020-05-24 23:42:23 编译 | 这只萌萌 编辑 | 丛 末 踩过坑才知道哪些路不可行,有时候犯错误也能帮助我们变得更加专业. 数据科学家Archy de Berker 在本文中详述了 ...
- 使用WCDB中踩过的坑
使用WCDB中踩过的坑 一.遇到的问题 在版本覆盖安装时,发现有些数据丢失:后通过抓包查看沙盒数据库文件时,发现WCDB数据库某张表损坏,造成数据丢失. 二.调查问题过程 查看问题出现的版本4.7.6 ...
- Centos7+mysql57+python3安装过程中踩过的坑
Centos7+mysql57+python3安装过程中踩过的坑 说明: 为了练习Django项目,准备在虚拟机中安装Centos7+mysql57+python3.在windows环境下通过Navi ...
- 启动mq 在虚拟机中_记在使用rocketmq client客户端过程中踩到的坑
前言 最近项目中使用阿里的RocketMQ来做消息队列,具体怎么使用RocketMQ不在本文讨论范围之内,其相关帮助文档可以参考如下链接 本文主要记录在使用rocketmq client时,遇到的一些 ...
- 从vue文件中抽取出子组件的流程及过程中踩过的坑
流程: 1. 确保注册.引入子组件的正确性: 创建一个新的vue文件,包含基本的template,及export的内容,其中可简单包含空的data函数.暂时先不把子组件中的代码移出.在父组件中impo ...
- SonarQube的安装部署过程中踩过的坑
在安装和是用sonarqube踩过如下坑,记录一下: 1.java版本不正确 java版本的问题,主要体现在两个方面, 第一个:是需要安装对应电脑版本的jdk, 具体报如下错误: Unable to ...
- android 多进程 坑,Android 开发中踩过的坑之八:多进程问题
这是个需要细心处理的坑. 1 内存: 在manifest中可以对各个组件声明其所在的进程: android:process=":name" 然后对应的Acitivity, Rece ...
- 深入分析网络编程中踩过的坑
网络编程中经常会遇到一些异常的情况,定位问题需要了解协议栈的实现,以下是工作中遇到的一些常见问题的深入分析和解决思路. 问题1:server端业务进程响应心跳超时被监控进程kill,导致数据或者逻辑异 ...
- ionic2+angular2中踩的那些坑
好久没写什么东西了,最近在做一个ionic2的小东西,遇到了不少问题,也记录一下,避免后来的同学走弯路. 之前写过一篇使用VS2015开发ionic1的文章,但自己还没摸清门道,本来也是感兴趣就学习了 ...
最新文章
- TLE207x低噪声高速JFET-输入运算放大器的噪声特性测量
- 鸟哥的Linux私房菜(基础篇)-第五章、首次登陆与在线求助 man page
- wxWidgets:wxMouseCaptureChangedEvent类用法
- 聊一聊大学做过的 7 种兼职以及收获感悟。
- chrome web store的信息
- Qt笔记-Q3DScatter中元素的移动和旋转
- 行为型模式:迭代器模式
- Python怎么学?一定要掌握学习方法
- 【mysql】期末数据库复习指南(《数据库系统概率》知识点总结,数据库系统原理,数据库设计课程复习)
- linux shell pattern,shell 三剑客之 sed pattern 详解
- 网络攻防实验(连更)
- DES加密算法(框图流程详细分析)(C++实现)
- Multi-Task Feature Learning for Knowledge Graph Enhanced Recommendation
- 2017 linux wine 迅雷,wine 迅雷下载安装(wine 迅雷极速版)【Linux上用迅雷7】
- 企业邮箱怎么换服务器,如何更换企业邮箱
- 搜集各种稀奇古怪的编码
- ubuntu浏览器突然使用不了搜狗拼音法
- 苹果计算机快捷键设置在哪里,苹果手机快捷键小方块怎么设置 【设置方法】...
- java 字体宽度_Java字体大小从宽度
- python PEP8问题及解决
热门文章
- 智慧楼宇系统:解决园区/写字楼90%的管理问题
- avg是java关键字_java 关键字练习
- CSS 幻术 | 有关光影效果的黑魔法
- [轉]运用项目管理WBS方法成功创建网店
- 代理记账公司怎样找客户?教你一个简单又有效的方法
- 基于SSM实现的云商城购物系统
- EAS单据F7引用设
- 【正版软件】激活Windows 7报0xC004F035错误
- 【论文翻译】-- GaitSet: Regarding Gait as a Set for Cross-View Gait Recognition
- 【计算机和UNIX汇编原理④】——指令系统(上)【标志寄存器 立即寻址 寄存器寻址 直接/寄存器/基址/变址寻址 万字总结】