一周的工作结束,详述一些实际中遇到的一些坑。
1、Map key 值为 Long 类型隐患
在使用Map的时候,一般都是使用String作为Key值,因为String是不可变的,但是以前在实际的编码场景中也没有遇到过其他的一些对象作为key值,然后第一次遇到,便产生一个Bug。
1-伪代码场景:根据商品id去上游查询商品详情,但是上游返回的数据格式是Json字符串。
原因:从截图中可以看书,上游返回了id = 2234762 的商品详情,但是解析的时候之后出现了红框 1 中结果,为null,原因可以从红框 2 查找,恍然大悟,上游返回的 id 转化之后变成了 Integer类型,但是调用方是拿Long类型去匹配,就出现该类问题。
解决办法: 使用jackJson解析Json字符串,jackson可以配置解析属性,将所有的key值都转化为String类型。
2、拆箱导致NPE
2-拆箱NPE伪代码场景:调用上游,获取上游返回结果,根据返回结果进行赋值。
原因:从伪代码截图中可以看出来,已经对上游的返回结果进行了判空处理,但是怎么还是出现了NPE呢?int id =user.getId(),在这一步出现了什么问题呢? 打开debug模式可以发现,当user对象中获取的id是包装类型Integer并且为null时,就会出现 int id = null;造成npe。
建议:1、调用端对于上游包装类型返回结果尽量判空。2、服务提供方在返回属性结果时尽量使用基本数据类型,减少调用端npe的可能性。
3、spring aop 使用误区
1、编译器使用 ajc,不管切面使用注解为 @Aspect + @Component 还是 @Aspect ,使用的都是原生的AspectJ静态字节码技术完成切面。
2、编译器使用 javac,如果注解单独使用 @Aspect,切面无效。如果是 @Aspect + @Component,那么使用的是JDK的动态字节码技术或者是cglib的动态字节码技术完成切面。
网友评论