一个StringUtils引发的bug

今天测试跟我说,一个接口的查询条件没生效。

数据库使用的MongoDB,MongoDB的查询,数据的类型必须是匹配的,否则也不报错,只是这个条件不会生效。

看了下代码,发现在设置Criteria前,条件是使用StringUtils.isEmpty()来判断是否为空的,但是这个条件类型应该为ObjectId。

看下StringUtils.isEmpty()的代码

public static boolean isEmpty(@Nullable Object str) {
    return str == null || "".equals(str);
}

再看下equals方法

/**
 * Compares this string to the specified object.  The result is {@code
 * true} if and only if the argument is not {@code null} and is a {@code
 * String} object that represents the same sequence of characters as this
 * object.
 *
 * @param  anObject
 *         The object to compare this {@code String} against
 *
 * @return  {@code true} if the given object represents a {@code String}
 *          equivalent to this string, {@code false} otherwise
 *
 * @see  #compareTo(String)
 * @see  #equalsIgnoreCase(String)
*/
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中,会把Object强转成String类型,这样再作为条件去查询自然是不生效的。

改为使用ObjectUtils.isEmpty()即可。

发表评论

电子邮件地址不会被公开。 必填项已用*标注