JSONObject踩坑经历

一、问题描述

在实现一客户端接口时(该接口的主要作用是返回用户的持仓明细,通过@ResponseBody注解返回Json串),测试时发现请求发生了错误,返回了错误页,如下图

 

疑问1、但是在接口代码中会捕获异常,即使是发生了异常也只会返回500的json串,模拟接口代码如下:

   

    @RequestMapping("/index.do")
	@ResponseBody
	public Object test(HttpServletRequest request, HttpServletResponse response){
		Map<String, Object> resultMap = new HashMap<String, Object>();
		
		try {
			List<TestModel> modelList = new ArrayList<TestModel>();
			TestModel modle = new TestModel();
			modle.setDate(new Date().getTime());
			modelList.add(modle);
			String retQuery = JsonUtils.toJson(modelList);
			Object ret = null;
			ret = JSONArray.fromObject(StringUtils.isBlank(retQuery) ? "[]" : retQuery);
			resultMap.put(ComRetCode.RET, ret);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			InterfaceRetCode.setAppCodeDesc(resultMap, ComRetCode.FAIL);
		}
		return resultMap;
	}

 

疑问2、工程里实现了SimpleMappingExceptionResolver对异常统一处理,主要是打日志和跳转到错误页,奇怪的是这里也没有异常日志打印出来,那为什么会显示错误页。没办法只能单步调试了,首先先介绍下@ResponseBody注解, 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。因为在spring中配置了

<property name="defaultViews">
            <list>
                <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" />
            </list>
</property>

因此会将接口中返回的数据序列化JSon格式的数据

 

开始调试,程序很乖巧的走到了return resultMap; 没办法只能F5跟进去了,一步一步走吧,走到序列化第一步的时候还没有问题,如下图

 

但是到循环序列化map中的key和value时就出现了问题,序列化属性price时正常,序列化name时出现问题,如下图

属性name的值为null但是判断的时候if( valueElem == null )竟然为false,从而跑到了else里面,于是就在value序列化的时候抛异常了

百思不得其解,问什么明明是null,但是判断却不是,最后还是依靠Google爸爸得到了答案,JSONObject的判空不能用 == null 它提供的专门的方法JsonObject.isNull(参考http://blog.csdn.net/superjimmy/article/details/52535993);

那么现在只解决了情况报错的问题,第二个问题异常为什么没有被捕获,还能返回统一的错误页。

答案如下:

SimpleMappingExceptionResolver只能捕获controller中的异常,而上面json异常是在@ResponseBody处理中抛出来的因此没有捕获到,但是问什么会显示统一的错误页呢?最后查看了一下web.xml配置,发现

 

<!-- 出错页面定义 -->
    <error-page>
        <exception-type>java.lang.Throwable</exception-type>
        <location>/ftl/main/error/500.ftl</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/ftl/main/error/500.ftl</location>
    </error-page>
    <error-page>
        <error-code>404</error-code>
        <location>/ftl/main/error/404.ftl</location>
    </error-page>

这里也配置了错误页。。。

踩坑,填坑完毕!!

转载于:https://my.oschina.net/hnrpf/blog/845365

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值