记一次map中null坑


现象:前端ajax的post请求中的date中不存在store_code字段,但是后端controller由于逻辑复用需要使用request.getParamter("store_code");然后将该值放到pack(公司框架定义的一个数据结构,用户生成json类型的报文。支持多层嵌套),然后将pack转换为json进行socket请求。
最终生成的json中,有store_code="null"现象发生,这导致了,发送短信使用短信模板嵌套进行字符串替换(判断store_code是否为空进行替换"null"不是空,尴尬了。。。)的时候,导致短信发送内容中含有"null"字符串.这可是个大问题。。。生产事故产生了。
原因:map获取value之后没有判断是否为空,就进行了json字符串的拼接,导致store_code="null"现象发生。
解决
看框架源码:

jsonStr = "{";
		/*字符串值*/
		Iterator<Map.Entry<String, String>> iterator = tagMap.entrySet().iterator();
		while (iterator.hasNext()) {
			Map.Entry<String, String> entry = iterator.next();
			jsonStr += "\"" + entry.getKey() + "\":\"" + entry.getValue() + "\"";
			if(iterator.hasNext())
				jsonStr += ",";	
		}


pack中定义了LinkedHashMap<String, String>类型用于接收用户set进去的数据。转换为json类型的时候,是使用string进行拼接的,而问题出现了,LinkedHashMap<String, String>中,根据key获取value,如果value为空,没有进行判断是否为null,转而进行了字符串的拼接,以至于问题产生。
总结:

当字段不存在时,request.getParamter("store_code");获取的是空对象null--当时刚开始排查的时候找不到问题所在,产生了对这个的怀疑,傻了。。
map是允许value为null的时候,不要直接进行字符串的拼接,应该先判断一下进行不同业务的处理。

验证以上问题:

public static void main(String[] args) {
		LinkedHashMap<String, String> tagMap = new LinkedHashMap<String, String>();
		String num1 = "key";
		String value = null;
		tagMap.put(num1, value);
		String result = tagMap.get(num1);
		System.out.println(result);
		System.out.println(result==null);//说明你存进去的是null-空对象,取出来的也是null,String本身就是对象。
		System.out.println("".equals(result));
		System.out.println("null".equals(result));
		System.out.println("'"+result+"'");//一旦进行字符串的拼接,null对象就变成了普通的字符串,值为null
//		Map.Entry<String, String> map = (Entry<String, String>) tagMap.entrySet();
		Iterator<Map.Entry<String, String>> iterator = tagMap.entrySet().iterator();//遍历map的key和value
		String jsonStr = "{";
		while (iterator.hasNext()) {
			Map.Entry<String, String> entry = iterator.next();
			jsonStr += "\"" + entry.getKey() + "\":\"" + entry.getValue() + "\"";
			if(iterator.hasNext())
				jsonStr += ",";	
		}
		jsonStr+="}";
		System.out.println(jsonStr);
	}

结果:

null
true
false
false
'null'
{"key":"null"}

发布了23 篇原创文章 · 获赞 0 · 访问量 2942

猜你喜欢

转载自blog.csdn.net/kris_lh123/article/details/101548592