小程序 - 图片上传BUG:关于文件上传(AOP拦截请求)

bug详情1

java.lang.IllegalStateException: It is illegal to call this method if the current request is not in asynchronous mode 
2021-03-24 14:13:02.602 ERROR 9812 --- [io-8089-exec-10] o.a.c.c.C.[.[.[.[dispatcherServlet]      : Servlet.service() for servlet [dispatcherServlet] in context with path [/app] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: com.alibaba.fastjson.JSONException: write javaBean error, fastjson version 1.2.75, class org.springframework.web.multipart.support.StandardMultipartHttpServletRequest, fieldName : 0] with root cause

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:1785) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at org.apache.catalina.connector.RequestFacade.getAsyncContext(RequestFacade.java:1068) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
	at javax.servlet.ServletRequestWrapper.getAsyncContext(ServletRequestWrapper.java:486) ~[javax.servlet-api-4.0.1.jar:4.0.1]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_201]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_201]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_201]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_201]
	at com.alibaba.fastjson.util.FieldInfo.get(FieldInfo.java:571) ~[fastjson-1.2.75.jar:na]
	at com.alibaba.fastjson.serializer.FieldSerializer.getPropertyValueDirect(FieldSerializer.java:143) ~[fastjson-1.2.75.jar:na]
	at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:282) ~[fastjson-1.2.75.jar:na]
	at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:149) ~[fastjson-1.2.75.jar:na]
	at com.alibaba.fastjson.serializer.ObjectArrayCodec.write(ObjectArrayCodec.java:103) ~[fastjson-1.2.75.jar:na]
	at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:312) ~[fastjson-1.2.75.jar:na]
	at com.alibaba.fastjson.JSON.toJSONString(JSON.java:769) ~[fastjson-1.2.75.jar:na]
	at com.alibaba.fastjson.JSON.toJSONString(JSON.java:707) ~[fastjson-1.2.75.jar:na]
	at com.alibaba.fastjson.JSON.toJSONString(JSON.java:672) ~[fastjson-1.2.75.jar:na]
	at com.hongy.interceptor.ControllerAspect.doAround(ControllerAspect.java:42) ~[classes/:na]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_201]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_201]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_201]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_201]

原因1

在项目中做了一个AOP,打印请求。
当使用切面时,如果使用args中包含了request对象会到导致程序抛出throwable异常信息,所以加切面时建议将args数组中的内容进行移除。或者不要直接将前台的请求进行拦截后进行json转换。
在这里插入图片描述

解决方案1

 

Object[] args = pjp.getArgs();
// 在处理参数,序列化时过滤掉request和response
List<Object> logArgs = streamOf(args)
       .filter(arg -> (!(arg instanceof HttpServletRequest) && !(arg instanceof HttpServletResponse)))
       .collect(Collectors.toList());

// 静态方法
public static <T> Stream<T> streamOf(T[] array) {
     return ArrayUtils.isEmpty(array) ? Stream.empty() : Arrays.asList(array).stream();
}

bug详情2:

java.io.FileNotFoundException: MultipartFile resource [file] cannot be resolved to absolute file path
2021-03-24 14:56:26.037 ERROR 27156 --- [nio-8089-exec-1] o.a.c.c.C.[.[.[.[dispatcherServlet]      : Servlet.service() for servlet [dispatcherServlet] in context with path [/app] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: com.alibaba.fastjson.JSONException: write javaBean error, fastjson version 1.2.75, class org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile, fieldName : 0, write javaBean error, fastjson version 1.2.75, class org.springframework.web.multipart.MultipartFileResource, fieldName : resource] with root cause

java.io.FileNotFoundException: MultipartFile resource [file] cannot be resolved to absolute file path
	at org.springframework.core.io.AbstractResource.getFile(AbstractResource.java:138) ~[spring-core-5.2.12.RELEASE.jar:5.2.12.RELEASE]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_201]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_201]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_201]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_201]
	at com.alibaba.fastjson.util.FieldInfo.get(FieldInfo.java:571) ~[fastjson-1.2.75.jar:na]
	at com.alibaba.fastjson.serializer.FieldSerializer.getPropertyValueDirect(FieldSerializer.java:143) ~[fastjson-1.2.75.jar:na]
	at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:282) ~[fastjson-1.2.75.jar:na]
	at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:149) ~[fastjson-1.2.75.jar:na]
	at com.alibaba.fastjson.serializer.FieldSerializer.writeValue(FieldSerializer.java:318) ~[fastjson-1.2.75.jar:na]
	at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:470) ~[fastjson-1.2.75.jar:na]
	at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:149) ~[fastjson-1.2.75.jar:na]
	at com.alibaba.fastjson.serializer.ListSerializer.write(ListSerializer.java:135) ~[fastjson-1.2.75.jar:na]
	at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:312) ~[fastjson-1.2.75.jar:na]
	at com.alibaba.fastjson.JSON.toJSONString(JSON.java:769) ~[fastjson-1.2.75.jar:na]
	at com.alibaba.fastjson.JSON.toJSONString(JSON.java:707) ~[fastjson-1.2.75.jar:na]
	at com.alibaba.fastjson.JSON.toJSONString(JSON.java:672) ~[fastjson-1.2.75.jar:na]
	at com.hongy.interceptor.ControllerAspect.doAround(ControllerAspect.java:54) ~[classes/:na]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_201]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_201]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_201]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_201]

解决方案:

报错行依然在 param = JSONObject.toJSONString(logArgs);
应该是MultipartFile类型的文件传输报错,再把该类型的参数排除掉。

Object[] args = pjp.getArgs();
//序列化时过滤掉request和response以及multipartFile文件
List<Object> logArgs = streamOf(args)
        .filter(arg -> (!(arg instanceof HttpServletRequest) && !(arg instanceof HttpServletResponse)) && !(arg instanceof MultipartFile))
        .collect(Collectors.toList());
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值