问题根源:转化目标实体类的属性要与被转JSON字符串总的字段 一 一对应!字符串里可以少字段,但绝对不能多字段。
先附上我这段出现了问题的源码:
// 1.接收并转化相应的参数。需要在pom.xml中引入jackson-databind这个包 String shopStr = HttpServletRequestUtil.getString(request, "shopStr"); ObjectMapper mapper = new ObjectMapper(); Shop shop = null; try { // 将前端接收来的一些String的信息,转换为Shop实体类 shop = mapper.readValue(shopStr, Shop.class); } catch (Exception e) { modelMap.put("success", false); modelMap.put("errMsg", e.getMessage()); return modelMap; }
开始这里跑得时候也不报错,但就是跑不通,就用debug断点一句一句查看,发现问题就出在了
shop = mapper.readValue(shopStr, Shop.class);这一句上。
网上搜索了若干方法都没有发现问题所在,然后阅读文档才发现有这样一个参数设置:
//设置输入时忽略JSON字符串中存在而Java对象实际没有的属性 mapper.getDeserializationConfig().set( org.codehaus.jackson.map.DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
然后我就想,是不是我前端发送数据的时候塞错数据了?(PS:不要着急乱添加上面这个设置,原因下面会说)
于是又用断点测了下值(如下图):
然后去跟目标实体类对了下字段。
发现这里shopStr里并没有多出没有字段,那没道理跑不通啊,于是再仔细一看! 发现是没有多字段,但是 = =
实体类里这个属性为shopCategory 而我测试出来shopStr里的这个字段我拼成了shopCatrgory。
然后去js里看了下代码,果不其然。一个字母写错了。
我是真真的把自己服哈了,归根结底,居然是这种低级错误导致的。
前面说到的不要乱添加上面的设置原因就是,如果你也跟我一样是因为打错字母导致多了一个字段的,那么你就算添加了上面的那个设置,你在后面用值时,也会发现取不到你想要用的值,
而且你添加了上面设置,是不报错了,但是会导致问题更不好找,就好比我添加了以后,在取转化后shop对象里的shopCategory时,会是NULL。那你再想找到NULL原因,估计就很困难了。