详解Spring的StringUtils踩坑记录

网友投稿 487 2023-07-01

详解Spring的StringUtils踩坑记录

详解Spring的StringUtils踩坑记录

起因

最近在写CRUD的时候,发现有个分页的VO写的健壮性比较差,一时手痒改了一下,没想到改了之后好几个功能都出现了问题。

原VO关键代码如下:

public class PageVo implements Serializable{

// ...省略所有无关代码

Map query

}

这个VO是用于从前端分页查询时传参,而query是用于传递查询条件的(这里不讨论用Map传参是否合理)。当前端无查询条件时则会导致query为null,如果不注意容易出现NPE。

所以我就改造成下面这样了。

public class PageVo implements Serializable{

// ...省略所有无关代码

Map query=new HashMap<>

}

但是没想到就是这么简单的改造居然都翻车(・・`)

没办法,只好去排查问题。

发现问题

想过很多种原因,但是我真没想到居然是因为这样(/‵′)/~ ╧╧,不多说了,问题关键代码如下:

if (StringUtils.isEmpty(page.getQuery())) {

// 省略处理逻辑

}

居然用StringUtils去判断一个Map是否为空,好歹也换个CollectionUtils啊(╬ ̄皿 ̄)凸

虽然是前人挖坑,但是为什么Spring的`StringUtils居然设计成支持Object入参呢o_o ....

想了一下,还是去看看源码吧

源码分析

StringUtils的isEmpty()方法源码超级简单,三行代码搞定(其实严格来说就一行代码):

public static boolean isEmpty(@Nullable Object str) {

return (str == null || "".equals(str));

}

既然我的Map对象不为null,那么问题应该是因为String的equals()方法。不多说,继续跟踪源码

public boolean equals(Object anObject) {

if (this == anObject) {

return true;

}

// 问题出在这里

if (anObject instanceof String) {

String anotherBolYZsxUmString = (String)anObject;

int n = value.length;

if (n == anotherString.value.length) {

char v1[] = value;

char v2[] = anotherString.value;

int i = 0;

while (n-- != 0) {

if (v1[i] != v2[i])

return false;

i++;

}

return true;

}

}

return false;

}

这个equals()方法的逻辑很简单

入参为null则返回true

入参不为String类型返回false

入参对象和this对象都为String就比较它们内置的char[]数组长度和每个char元素是否相同,满足则返回true,否则返回false

而我的问题就是由第二点引起的,因为类型不相同┴─┴︵╰(‵□′╰)

教训总结

不建议使用Spring的StringUtils的isEmpty()对非String类型的对象判空。(这里建议换成apache common的StringUtils或者Google Guava的Strings,这两个工具包都是类型强约束的)

无论是修改哪处的代码都最好检查一下引用,避免修复小问题引出大问题

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:maven 打包时间戳问题
下一篇:Spring AOP访问目标方法的参数操作示例
相关文章

 发表评论

暂时没有评论,来抢沙发吧~