首页 > 编程语言 >AOP日志切面拦截出现异常:java.lang.IllegalStateException: It is illegal to call this method if the current requ

AOP日志切面拦截出现异常:java.lang.IllegalStateException: It is illegal to call this method if the current requ

时间:2023-07-07 22:33:00浏览次数:36  
标签:lang fastjson java requ alibaba jsonObject com serializer

问题描述

一个下载功能,后端代码出现异常,被AOP的日志切面拦截,出现异常。

具体异常如下:

java.lang.IllegalStateException: It is illegal to call this method if the current request is not in asynchronous mode (i.e. isAsyncStarted() returns false)

	at org.apache.catalina.connector.Request.getAsyncContext(Request.java:1781)

	at org.apache.catalina.connector.RequestFacade.getAsyncContext(RequestFacade.java:1056)

	at javax.servlet.ServletRequestWrapper.getAsyncContext(ServletRequestWrapper.java:431)

	at com.alibaba.fastjson.serializer.ASMSerializer_7_ShiroHttpServletRequest.write(Unknown Source)

	at com.alibaba.fastjson.serializer.ASMSerializer_1_ShiroHttpServletResponse.write(Unknown Source)

	at com.alibaba.fastjson.serializer.JSONSerializer.writeWithFieldName(JSONSerializer.java:333)

	at com.alibaba.fastjson.serializer.JSONSerializer.writeWithFieldName(JSONSerializer.java:311)

	at com.alibaba.fastjson.serializer.ObjectArrayCodec.write(ObjectArrayCodec.java:118)

	at com.alibaba.fastjson.serializer.MapSerializer.write(MapSerializer.java:270)

	at com.alibaba.fastjson.serializer.MapSerializer.write(MapSerializer.java:44)

	at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:285)

	at com.alibaba.fastjson.JSON.toJSONString(JSON.java:955)

	at com.XXXX.common.aspect.LogAspect.methodBefore(LogAspect.java:78)

这个异常java.lang.IllegalStateException是Java中的一个表示状态错误的异常。它指示在非异步模式下调用了一个只允许在异步模式下调用的方法。该异常是由Tomcat抛出的。

原因分析

获取请求参数,对参数进行处理,封装到jsonObject对象,执行jsonObject.toJSONString()时,抛出上述异常

Object[] args = joinPoint.getArgs();
this.argsToString(jsonObject, args);

jsonObject.put("方法参数", args);

String logMsg = jsonObject.toJSONString();
log.info(logMsg);

具体的原因是:当参数是servletRequest,ServletResponse,MultipartFile等类型参数,不能进行序列化,否则将出现上述异常

解决方案

对不能进行序列化的入参过滤,这里对servletRequest,ServletResponse,MultipartFile等参数过滤

    /**
     * 参数处理
     */
    private void argsToString(JSONObject jsonObject, Object[] args) {
        // 检查参数是否包含servletRequest,ServletResponse,MultipartFile等参数,其不能被序列化
        boolean parameterExclude = Arrays.stream(args).anyMatch(arg -> arg instanceof MultipartFile || arg instanceof ServletResponse || arg instanceof ServletRequest);
        if (parameterExclude) {
            StringBuilder fileInfo = new StringBuilder();
            Arrays.stream(args).filter(arg -> arg instanceof MultipartFile).forEach(file -> {
                MultipartFile multipartFile = (MultipartFile) file;
                String fileName = multipartFile.getOriginalFilename();
                long fileSize = multipartFile.getSize();
                fileInfo.append("【文件名:").append(fileName).append(" ,文件大小: ").append(fileSize).append("】");
            });
            jsonObject.put("方法参数", fileInfo);
        } else {
            jsonObject.put("方法参数", args);
        }
    }

标签:lang,fastjson,java,requ,alibaba,jsonObject,com,serializer
From: https://blog.51cto.com/chencoding/6656826

相关文章

  • Java官方笔记14流
    ProcessingDatainMemoryTheStreamAPIisprobablythesecondmostimportantfeatureaddedtoJavaSE8,afterthelambdaexpressions.Inanutshell,theStreamAPIisaboutprovidinganimplementationofthewellknownmap-filter-reducealgorithmtoth......
  • Java技术分享:SpringBoot+mysql+...
    放个效果图: 准备项目首先在MySql控制台输入一下sql语句创建student数据库和student。createdatabsestudent;usestudent;CREATETABLE`student`(`stu_id`bigint(20)NOTNULL,`stu_name`varchar(45)DEFAULTNULL,`stu_sex`varchar(6)DEFAULTNUL......
  • Dockerfile制作golang-ubuntu_22.04基础镜像
    DockerfileFROMubuntu:22.04ADDgo1.18.5.linux-amd64.tar.gz/usr/localENVPATH=/usr/local/go/bin:$PATH生成镜像#dockerbuild-fDockerfile-tgolang-1.18.5:ubuntu-22.04.验证镜像#dockerrun-it--rmgolang-1.18.5:ubuntu-22.04goversiongoversiongo......
  • 使用Java实现基于OAuth 2.0的单点登录功能
    本文将介绍如何使用Java编写一个基于OAuth2.0的单点登录系统,通过OAuth2.0实现用户在多个应用程序间的无缝登录体验1.什么是OAuth2.0?OAuth2.0是一种开放的授权框架,用于在应用程序之间安全地共享用户的身份验证和授权信息。它允许用户授权第三方应用程序代表其访问受保护的资......
  • Java 抽象类的定义与使用
    抽象类抽象类举例: abstractPeople{publicabstractvoideat();publicabstractvoidsleep();}   抽象类的几个特点1.抽象类被修饰符abstract修饰 abstract类名{类体} 2.抽象类内可以存在抽象方法与非抽象方......
  • 金三银四喜提offer!秋招蚂蚁金服Java研发岗四面
     面试流程  先说下面试流程,一般大公司都有3-4轮技术面,1轮的HR面。就蚂蚁金服而言,我共经历了4轮技术面,前两轮主要是问基础和项目实现,第3轮是交叉面,两个面试官,主要是问项目实现和拓展。第4轮是部门老大面,主要就问一些架构、技术和业务的理解、个人发展比较抽象的东西了,现在基......
  • 阿里Java三面凉凉:微服务,Redis,JVM一个都搞不懂
    前言:金三银四刚刚过去了,不知道很多小伙伴都拿到自己心仪的offer没有,我这边也收到了一个粉丝投来的消息,说看到阿里的面试真题之后人都是懵的,发现自己一窍不通,下面给大家分享我这个粉丝的经历,以及我在这方面学习的经验。阿里微服务面试真题1.单片,SOA和微服务架构有什么区别?单......
  • ,软件运行监听地址 ,扫码登录,爬虫介绍,requests模块介绍和快速使用,get请求携带参数,编码
    补充#软件运行,监听地址127.0.0.1 只能访问127.0.0.1localhost不能用本机ip地址访问,外部所有人都不能访问你0.0.0.0 127.0.0.1localhost本机ip地址访问同一个局域网内,都可以通过ip地址访问#本地host解析 输入网址---》www.baidu.com---->找本地host文......
  • Java-八股文
    hashcode()、equals()1.如果hashcode()不相同,两个对象一定不是同一个对象2.如果hashcode()相同,两个对象不一定上同一个对象,需要进一步判别equals3.如果equals相同,应当认为两个对象就是相同对象由于hashcode方法仅返回一个值,equals里面有若干逻辑,因此,部分集合类的判断中,会优先......
  • Java线程池详解:Future的使用和实现
    提交到线程池中执行的异步任务都会返回一个任务的Future,所以这里先介绍一下Future的使用和实现。异步任务通常会被提交到线程池中去执行,但任务并非提交到线程池后就不管不顾了,在某些时刻我们希望能够取消任务,同时也希望在任务执行完成后获取到任务的执行结果。Java提供了Futur......