分析Spring的StringUtils踩坑问题-创新互联

这篇文章主要讲解了“分析Spring的StringUtils踩坑问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“分析Spring的StringUtils踩坑问题”吧!

创新互联-专业网站定制、快速模板网站建设、高性价比阳西网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式阳西网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖阳西地区。费用合理售后完善,十年实体公司更值得信赖。

起因

最近在写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 anotherString = (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()方法的逻辑很简单

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

而我的问题就是由第二点引起的,因为类型不相同

感谢各位的阅读,以上就是“分析Spring的StringUtils踩坑问题”的内容了,经过本文的学习后,相信大家对分析Spring的StringUtils踩坑问题这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联网站建设公司,,小编将为大家推送更多相关知识点的文章,欢迎关注!


本文名称:分析Spring的StringUtils踩坑问题-创新互联
文章链接:http://pwwzsj.com/article/cosdjg.html