getOutputStream() has already been called for this response

问题描述

在做java导出Excel数据的时候,接口层面需要有HttpServletResponse的入参来设置输出流

然后执行的时候报getOutputStream() has already been called for this response错误

问题排查

返回的错误信息

{
    "timestamp": "2024-04-16T11:49:54.900+00:00",
    "status": 500,
    "error": "Internal Server Error",
    "message": "getOutputStream() has already been called for this response",
    "path": "/export/exportData"
}

查询错误日志

java.lang.IllegalStateException: getOutputStream() has already been called for this response
	at org.apache.catalina.connector.Response.getWriter(Response.java:586)
	at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:225)
	at com.alibaba.fastjson.serializer.ASMSerializer_5_ResponseFacade.write(Unknown Source)
	at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:312)
	at com.alibaba.fastjson.JSON.toJSONString(JSON.java:793)
	at com.alibaba.fastjson.JSON.toJSONString(JSON.java:731)
	at com.alibaba.fastjson.JSON.toJSONString(JSON.java:688)
	at com.XXX.open.record.aspect.ServiceAspect.before(ServiceAspect.java:54)
	at sun.reflect.GeneratedMethodAccessor296.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:626)
	at org.springframework.aop.aspectj.AspectJMethodBeforeAdvice.before(AspectJMethodBeforeAdvice.java:44)
	at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:55)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
	at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88)
从错误日志可以发现是在切面ServiceAspect类的before方法报错的

点击进入报错的代码,发现此处的方式是

@Before(value = POINT_CUT)
    public void before(JoinPoint joinPoint) {
        String className = joinPoint.getTarget().getClass().getName();
        String methodName = joinPoint.getSignature().getName();
        StringBuilder logStr = new StringBuilder();
        logStr.append(className)
                .append(".")
                .append(methodName)
                .append("() , params: ");
        Object[] args = joinPoint.getArgs();
        for (Object arg : args) {
            logStr.append(JSONObject.toJSONString(arg) + ", ");//报错代码
        }
        RequestContext requestContext = RequestContext.getCurrentContext();
        requestContext.set(ConfigConstants.REQUEST_DATA, logStr.toString());
        // 通过Sleuth的Tracer获取本次请求的唯一标识,并作为logId打印
        if (null != tracer && null != tracer.currentSpan()) {
            requestContext.set(RequestParamConst.LOG_ID, tracer.currentSpan().context().traceIdString());
        } else {
            requestContext.set(RequestParamConst.LOG_ID, "");
        }

看来是json序列化HttpServletResponse参数时报错的。

解决方法

添加判断,如果入参类型是HttpServletResponse,则不序列号。问题解决

@Before(value = POINT_CUT)
    public void before(JoinPoint joinPoint) {
        String className = joinPoint.getTarget().getClass().getName();
        String methodName = joinPoint.getSignature().getName();
        StringBuilder logStr = new StringBuilder();
        logStr.append(className)
                .append(".")
                .append(methodName)
                .append("() , params: ");
        Object[] args = joinPoint.getArgs();
        for (Object arg : args) {
            if(arg instanceof HttpServletResponse){
                continue;
            }
            logStr.append(JSONObject.toJSONString(arg) + ", ");
        }
        RequestContext requestContext = RequestContext.getCurrentContext();
        requestContext.set(ConfigConstants.REQUEST_DATA, logStr.toString());
        // 通过Sleuth的Tracer获取本次请求的唯一标识,并作为logId打印
        if (null != tracer && null != tracer.currentSpan()) {
            requestContext.set(RequestParamConst.LOG_ID, tracer.currentSpan().context().traceIdString());
        } else {
            requestContext.set(RequestParamConst.LOG_ID, "");
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/551034.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

16 - Debian如何配置vsftpd(1)实现匿名上传下载

作者:网络傅老师 特别提示:未经作者允许,不得转载任何内容。违者必究! Debian如何配置vsftpd(1)实现匿名上传下载 《傅老师Debian小知识库系列之16》——原创 前言 傅老师Debian小知识库特点&#xff1a…

openfoam与blastfoam的版本兼容解决方法(从而解决正确运行blastFoam里面的案例,避免报错)

问题:最近运行blastFoam里面自带的案例时,全都报错,使用的openfoam2212加上blastfoam6.2.0。也尝试使用了openfoam7加上blastfoam2.0都报错 比如报错如下: --> FOAM FATAL IO ERROR: error in IOstream "OSHA1stream.s…

刷穿力扣006-剑指offer一数组——02寻找目标值-二维数组

刷穿力扣006-剑指offer<一>数组——02寻找目标值-二维数组 基本面试题都是我带大家刷的力扣热题100和剑指offer的75道题&#xff0c;建议刷两遍&#xff01;&#xff08;ps:想找工作实习的同学&#xff0c;文末有面试八股和简历模板&#xff09; 题目&#xff1a; 语言…

探索分布式系统监控zabbix------------自动发现与自动注册

目录 一、部署 zabbix 服务端 二、部署 zabbix 客户端 2.1环境准备 2.2服务端和客户端都配置时间同步 &#xff08;ntp&#xff09; 2.2.1服务端zbx-server 2.2.2服务端zabbix-agent01客户端 2.3客户端配置时区&#xff0c;与服务器保持一致 2.4设置 zabbix 的下载源&…

【Yapi】Idea配置easy-yapi

Idea配置easy-yapi 第一步&#xff1a;安装EasyApi 下载好EasyYapi的Plugins&#xff0c;在Settings—Plugins—Install Plugin from Disk…导入并安装&#xff0c;勾选为enabled。第二步&#xff1a;配置EasyApi 打开Settings—EasyApi&#xff0c;server设置为你的yapi地址&…

现代化个人博客系统 ModStartBlog v9.3.0 支持Laravel 9

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场&#xff0c;后台一键快速安装 …

新兴存内计算芯片架构、大型语言模型、多位存内计算架构——存内计算架构的性能仿真与对比分析探讨

一.大型语言模型&#xff08;LLM&#xff09; 近年来&#xff0c;基于注意力机制的大型语言模型&#xff08;LLM&#xff09;已经取得了令人瞩目的成功。这些模型的尺寸在不断增长&#xff0c;每两年增长240倍&#xff0c;而相应的计算需求则增长了近750倍。然而&#xff0c;硬…

本地搭建属于你自己的AI搜索引擎 支持多家AI模型

FreeAskInternet 是一个完全免费、私有且本地运行的搜索聚合器&#xff0c;并使用 MULTI LLM 生成答案&#xff0c;无需 GPU。用户可以提出问题&#xff0c;系统将进行多引擎搜索&#xff0c;并将搜索结果合并到LLM中&#xff0c;并根据搜索结果生成答案。全部免费使用。 项目…

实验六 智能手机互联网程序设计(微信程序方向)实验报告

实验目的和要求 请完成创建图片库应用&#xff0c;显示一系列预设的图片。 提供按钮来切换显示不同类别的图片。 二、实验步骤与结果&#xff08;给出对应的代码或运行结果截图&#xff09; 1.WXML <view> <button bindtap"showAll">所有图片</but…

从零开始学习大模型

随着人工智能技术的快速发展&#xff0c;大模型已成为许多领域的热门话题。然而&#xff0c;大模型的创建并不是一件容易的事情。在本文中&#xff0c;我们将从零开始学习如何创建一个大模型&#xff0c;帮助读者掌握大模型的创建过程。 一、数据收集 创建大模型的首要任务是…

2024年在Vim中开发vue2+java

neovim 0.5刚出来的时代&#xff0c;那时刚有lua插件我很狂热。每天沉迷于打造自己的IDE之中。写过一堆相关的博客&#xff0c;也录过一些视频教程。后来发现neovim的接口和插件更新的很快&#xff0c;导致配置文件要不定期的修改&#xff0c;才能保证新版本的插件的适配。我也…

计算机网络 Cisco远程Telnet访问交换机和Console终端连接交换机

一、实验要求和内容 1、配置交换机进入特权模式密文密码为“abcd两位班内学号”&#xff0c;远程登陆密码为“123456” 2、验证PC0通过远程登陆到交换机上&#xff0c;看是否可以进去特权模式 二、实验步骤 1、将一台还没配置的新交换机&#xff0c;利用console线连接设备的…

ArcGIS加载的各类地图怎么去除服务署名水印

昨天介绍的&#xff1a; 一套图源搞定&#xff01;清新规划底图、影像图、境界、海洋、地形阴影图、导航图-CSDN博客文章浏览阅读373次&#xff0c;点赞7次&#xff0c;收藏11次。一体化集成在一起的各类型图源&#xff0c;比如包括影像、清新的出图底图、地形、地图阴影、道路…

苍穹外卖学习记录(一)

1.JWT令牌认证 JSON Web Token (JWT)是一个开放标准(RFC 7519)&#xff0c;它定义了一种紧凑的、自包含的方式&#xff0c;用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任&#xff0c;因为它是数字签名的。 JWT是目前最常用的一种令牌规范&#xff0c;它最…

【学习笔记】Python大数据处理与分析——pandas数据分析

一、pandas中的对象 1、Series对象 由两个相互关联的数组(values, index)组成&#xff0c;前者&#xff08;又称主数组&#xff09;存储数据&#xff0c;后者存储values内每个元素对应关联的标签。 import numpy as np import pandas as pds1 pd.Series([1, 3, 5, 7])print(…

Linux LVM与磁盘配额

目录 一.LVM概述 LVM LVM机制的基本概念 PV&#xff08;Physical Volume&#xff0c;物理卷&#xff09; VG&#xff08;Volume Group&#xff0c;卷组&#xff09; LV&#xff08;Logical Volume&#xff0c;逻辑卷&#xff09; 二.LVM 的管理命令 三.创建并使用LVM …

AutoPSA中推荐用户使用仿CII计算

Q:请问未知错误。优易AUtoPSAInDon3.app1670行是什么原因呢&#xff1f;如下图&#xff1a; A: 这是老的仿GLIF算法&#xff0c;遇到特殊情况有这个提示&#xff0c;建议使用仿CAESARII算法。

车载摄像头视频防抖处理解决方案,全新的稳定视觉体验

面对复杂多变的道路环境和车辆运动状态&#xff0c;如何确保车载摄像头拍摄的视频稳定清晰&#xff0c;一直是行业面临的重要挑战。美摄科技&#xff0c;作为视频防抖技术的领军企业&#xff0c;以其领先的车载摄像头视频防抖处理解决方案&#xff0c;为企业提供了全新的稳定视…

C++ - 文件流fstream

C 文件流是指在C编程中使用的用于文件输入输出操作的机制。这种机制允许程序员以类似于流的方式读取和写入文件数据。在C中&#xff0c;文件流通常使用<fstream>头文件提供的类来实现。 常用的文件流类包括&#xff1a; 1. std::ofstream&#xff1a;用于向文件中写入数…

筑牢个人信息安全防线,海云安受邀参加武汉“名家论坛”国家安全教育日专题讲座

近日&#xff0c;武汉“名家论坛”国家安全教育日专题讲座活动《“刷脸”有风险&#xff0c;如何保护我们的个人信息安全&#xff1f;》在武汉图书馆报告厅举办&#xff0c;海云安副总工程师李博士受邀参加本次活动。 活动以线下讲座、线上直播的形式&#xff0c;结合“普法讲座…
最新文章