описание проблемы
Функция загрузки, внутренний код имеет исключение, перехватывается аспектом журнала 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);
}
}