Возникло исключение при перехвате аспекта журнала AOP: java.lang.IllegalStateException: недопустимо вызывать этот метод, если текущий запрос

описание проблемы

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

Guess you like

Origin blog.csdn.net/qq_38628046/article/details/131599600