FastJson格式化Request对象导致的一次异常思考

Posted bee4j

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FastJson格式化Request对象导致的一次异常思考相关的知识,希望对你有一定的参考价值。

一、问题描述:

        近期,在环境中出现一个阻塞性的异常“nested exception is java.lang.IllegalStateException: It is illegal to call this method if the current request is not in asynchronous mode (i.e. isAsyncStarted() returns false)”。

二、问题影响:

       影响了日工作的正常工作进度;

       阻塞的关键点异常在捕获后被吃掉,未正确打印出来,影响了排查问题的方向。重新打印异常栈后,定位到问题并解决,恢复正常的工作进程。

三、问题复现过程:

       使用JUnit做一个最简单的单元测试,直接Json.from(request)

四、问题分析:

       FastJson是根据bean的get/set方法做反射解析的,当遇到Servlet3规范时(Servlet2.5是否会存在还没验证),恰好存在一个getAsyncContext()方法,内部的判断逻辑是servlet异步模式为false,直接抛出IllegalStateException,导致此种尴尬的异常出现,进而阻塞了工作的进程。

五、问题引发的思考:

      1.有没有必要直接打印框架的一些形参,比如Servlet的Request/Response,MQ的onMessage的方法形参,还有HttpClient的Response/ClosableResponse;

         直接打印MQ的onMessage的方法形参,看到的是一些二进制数组,没有可读性;

         直接打印HttpClient的Response/ClosableResponse,看到的是一些不可读的数据;

         直接打印Servlet的Request.getRequestURI,会增加更多的磁盘IO;

      2.是否可以考虑打印其中的业务参数,而不是那些比较贴近TCP发送/响应的请求,更多的打印应用层面的业务请求参数和响应结果;

      

以上是关于FastJson格式化Request对象导致的一次异常思考的主要内容,如果未能解决你的问题,请参考以下文章

源码分析之FastJson全局配置日期格式导致@JSONField(format = "yyyy-MM-dd")注解失效

使用fastjson解析数据后导致顺序改变问题

FastJson对于JSON格式字符串JSON对象及JavaBean之间的相互转换

FastJson对于JSON格式字符串JSON对象及JavaBean之间的相互转换

FastJson对于JSON格式字符串JSON对象及JavaBean之间的相互转换

FastJson对于JSON格式字符串JSON对象及JavaBean之间的相互转换