详解Spring的StringUtils踩坑记录
|
起因 最近在写CRUD的时候,发现有个分页的VO写的健壮性比较差,一时手痒改了一下,没想到改了之后好几个功能都出现了问题。 原VO关键代码如下:
public class PageVo implements Serializable{
// ...省略所有无关代码
Map<String,String> query
}
这个VO是用于从前端分页查询时传参,而query是用于传递查询条件的(这里不讨论用Map传参是否合理)。当前端无查询条件时则会导致query为null,如果不注意容易出现NPE。 所以我就改造成下面这样了。
public class PageVo implements Serializable{
// ...省略所有无关代码
Map<String,String> 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()方法的逻辑很简单
而我的问题就是由第二点引起的,因为类型不相同┴─┴︵╰(‵□′╰) 教训总结
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Android 亮屏及屏幕解锁代码
- 受保护的成员从java中的不同包访问 – 一个好奇心
- 在java servlet中处理“multipart / related”
- Java生成非对称型加密的公钥和私钥
- java – 为什么Netbeans以它的方式生成hashCode()?
- java – 将远程文件流式传输到文件对象中
- .net – LinkedList上的LINQ – 迭代LinkedListNode,而不是
- 无法解析java.lang.object类型 – Eclipse buildpath无法正
- java – 如何将一个月添加到日期并获得同一天
- java – 任何人都可以向我解释tools.jar(它绑在jdk / lib文
