使用Spring实现异常统一处理【三】--java.lang.IllegalStateException: STREAM问题的解决

Java开发中Duplicate key异常深度解析与实战解决方案 在Java后端开发中,集合与Map的转换是常见操作,其核心原理在于Map数据结构要求键(Key)必须唯一。当使用Stream API的Collectors.toMap等方法进行转换时,若出现重复键,系统会抛出IllegalStateException,这体现了数据一致性的重要技术价值。此类问题广泛存在于数据处理、缓存构建及配置加载等应用场景。本文结合最新的网络热词,如“duplicate entry 's0010-ehr' for key 'sso_tbl_job.sso_tbl_job_un'”所反映的数 阅读详情

在《使用Spring实现异常统一处理【二】》中,在处理JSON转换的异常时,自定义异常处理类,自个就报java.lang.IllegalStateException: STREAM错误,原因为:在该自定义异常处理类中,使用了response.getWriter()进行错误信息输出,而Spring的MappingJackson2HttpMessageConverter应该通过response.getOutputStream(),已获取了输出流。

在servlet标准中,是不允许同时使用response.getWriter()和response.getOutputStream()的,所以报java.lang.IllegalStateException: STREAM错误。

       原因知道了,解决方案就有谱了:在获取response.getWriter()出错时,就改用response.getOutputStream()输出流。

       关键代码:

String returnStr="{error:'"+exception.getMessage()+"'}";
try {
<span style="white-space:pre">	</span>writer = response.getWriter();
<span style="white-space:pre">	</span>writer.write(returnStr);
<span style="white-space:pre">	</span>writer.flush();
<span style="white-space:pre">	</span>writer.close();
} catch (Exception e) {
<span style="white-space:pre">	</span>try {
<span style="white-space:pre">	</span>OutputStream output=response.getOutputStream();
<span style="white-space:pre">	</span>output.write(returnStr.getBytes("UTF-8"));
<span style="white-space:pre">	</span>output.flush();
<span style="white-space:pre">	</span>output.close();
<span style="white-space:pre">	</span>} catch (Exception e1) {
<span style="white-space:pre">	</span>e1.printStackTrace();
<span style="white-space:pre">	</span>}
}


       完整代码:

public class CustomSimpleMappingExceptionResolver extends
		SimpleMappingExceptionResolver {

	@Override
	protected ModelAndView doResolveException(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception exception) {

		if (handler == null) {
			return null;
		}
		HandlerMethod handlerMethod = (HandlerMethod) handler;
		Method method = handlerMethod.getMethod();

		if (method == null) {
			return null;
		}
		Class<?> methodReturnType=method.getReturnType();
		ResponseBody responseBody = AnnotationUtils.findAnnotation(method,
				ResponseBody.class);
		if (methodReturnType.getName().equals("void")||responseBody != null) {
			PrintWriter writer;
			String returnStr="{error:'"+exception.getMessage()+"'}";
			try {
				writer = response.getWriter();
				writer.write(returnStr);
			    writer.flush();
				writer.close();
			} catch (Exception e) {
				try {		
					OutputStream output=response.getOutputStream();
					output.write(returnStr.getBytes("UTF-8"));
					output.flush();
					output.close();					
				} catch (Exception e1) {
					e1.printStackTrace();
				}
			}

		} else {
			String viewName = super.determineViewName(exception, request);			
			
			if (viewName != null) {// JSP格式返回

				Integer statusCode = super.determineStatusCode(request,
						viewName);
				if (statusCode != null) {
					super.applyStatusCodeIfPossible(request, response,
							statusCode);
				}
				return super.getModelAndView(viewName, exception, request);
			}
		}
		return new ModelAndView();

	}// doResolveException

}


<bean id="exceptionResolver"
		class="com.winssage.exception.CustomSimpleMappingExceptionResolver">
		<property name="defaultErrorView" value="/exception/errorpage" />
		<!--  定义异常处理页面用来获取异常信息的变量名,如果不添加exceptionAttribute属性,则默认为exception-->
		<property name="exceptionAttribute" value="exception" />
		<property name="exceptionMappings">
			<props>
				<!--不设置将根据defaultErrorView-->
				<prop key="java.lang.exception">/exception/errorpage</prop>
				<prop key="java.lang.RuntimeException">/exception/errorpage</prop>
			</props>
		</property>
		<!-- order=0,则无法在先在Controller通过注解进行异常处理,order=1刚刚好-->
		<property name="order" value="1"/> 
</bean>

<%@page contentType="text/html" pageEncoding="UTF-8" isErrorPage="true"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
	<h1>Hello World!error!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ${exception}
	</h1>	
</body>
</html>



  
Java异常处理核心原理与企业级实践指南 Java异常处理是JVM层面的结构化控制流机制,而非简单的错误兜底。其本质基于Throwable继承体系,通过Checked/Unchecked异常分类实现编译期契约与运行时语义分离。throw语句触发athrow字节码指令,throws声明构建调用链异常契约,而try-with-resources等语法糖背后是异常抑制(addSuppressed)与资源确定性释放的底层保障。该机制的技术价值在于将外部故障(如IO超时)与编程错误(如空指针)解耦,支撑高可用系统中的分级响应、全链路追踪与业务指标化。本文聚焦 阅读详情

相关推荐

Spring AOP实战:横切关注点解耦与切面开发避坑指南

面向Java Web开发者,Spring AOP是一种面向切面的编程范式,用于将日志、事务、监控等横切关注点从业务逻辑中分离。其核心基于代理机制与织入原理,通过Pointcut精准匹配连接点,Advice定义增强行为,Aspect封装可复用逻辑。相比HandlerInterceptor(仅限Web层)和手动代理(无法处理自调用),Spring AOP依托Spring容器统一管理代理Bean,保障跨层调用与依赖注入场景下的稳定拦截。技术价值在于提升代码内聚性、降低维护成本、支持非侵入式功能扩展。典型应用场景包

weixin_30240349的博客 431

java.lang.IllegalStateException: STREAMED

getReader和getInputSteam只能调用一次,如果调用getReader后再调用getInputStream就会抛出IllegalStateException异常,如果再次调用getReader就会得到空内容;反之也是如此。

SonOfWind0311的博客 4039

Java判空全攻略:从NPE防御到Optional与工具类实战

在Java开发中,空指针异常(NullPointerException)是最常见的运行时异常之一,它源于程序访问了未初始化或显式赋值为null的对象引用。理解判空的原理是编写健壮代码的基础,其技术价值在于提升系统稳定性、保证数据一致性并明确业务逻辑边界。通过防御性编程,开发者可以在方法参数校验、集合操作、链式调用等高频场景中有效拦截风险。本文聚焦Java判空的核心方法,涵盖传统的if判断、JDK7引入的Objects.requireNonNull,以及Java8的Optional容器,并深入解析Apache

weixin_34357887的博客 411

jxl导出EXCEL的java.lang.IllegalStateException异常

 http://blog.csdn.net/patriotlml/archive/2007/05/28/1628556.aspx我们在做文件上传或者下载,或者过滤等操作时,可能要用到页面的输出流.例如在JSP使用:    response.reset();    response.setContentType(”application/vnd.ms-excel”);    OutputStre

流氓猪的窝 3060

Java深入解析篇七之异常处理

Java 中所有异常和错误的根类是 ,它有两个直接子类: 和 。 1.2 Throwable 核心方法 1.3 Throwable 构造器 二、Checked Exception vs Unchecked Exception 2.1 核心区别 特性 Checked Exception Unchecked Exception 继承关系 Exception 的非 RuntimeException 子类 RuntimeException 及其子类 编译期检查 必须捕获或声明抛出 无强制要

萧瑟余晖的博客 309

CS5511芯片实战:如何用DP转LVDS驱动高刷显示器(附配置代码)

本文详细解析了CS5511芯片在DP转LVDS高刷显示器驱动方案中的应用,包括核心架构、寄存器配置、时序优化及典型问题排查。通过实战案例和配置代码,帮助开发者快速实现120Hz高刷新率显示,特别适合医疗影像和工业HMI等严苛场景。

m3n5b7v8c9x的博客 1077

java.lang.IllegalStateException: stream has already been operated upon or closed 异常

java.lang.IllegalStateException: stream has already been operated upon or closed

weixin_44668443的博客 1768

PCIE协议版--M.2接口规范V1.0中文版1——物理规格篇

5.1.3.双模块键模块:同时支持Socket1-DP、Socket1-SD。2.4.7.3.3.双面模块(使用H2.8、H3.2、H4.2连接器)6.5.8.2.5.热设计功率响应-带有风扇类别的薄平台笔记本电脑。2.3.7.1. Socket1&2射频连接器PIN-OUT。5.2.2.Socket2 PIN-OUT(机械KEY B)3.2.10.1.3.极薄的笔记本电脑的电源开关顺序的例子。5.1.1.Socket1-DP(机械KEY A)5.1.2.Socket1-SD(机械KEY E)

想你所想,做你所做 4679

java.lang.IllegalStateException: stream has already been operated upon or closed

这个错误是因为stream已经进行完终止操作,又去进行中间操作 下面这个运行就会报错 //1.集合转化成流 Stream<User> stream = userList.stream(); //年龄大于25岁 List<User> collect = stream.filter(new Predicate<User>() { @Override

liang博客 1047

1.毫米波雷达心率、呼吸原理实现(一)实例

毫米波雷达心率、呼吸检测原理本项目分两到三篇文章写完,第一阶段借鉴TI开源项目以及根据自己的见解适当更改信号处理链通过AWR1843汽车雷达传感器和DCA1000采集卡采集数据完成人体呼吸和心跳检测算法的实现。第二阶段将仿真成功的代码搬移TIAWR1843传感器并通过串口数据实现生命体征的实时处理。本文即为第一阶段实现过程。本文首先概述毫米波雷达呼吸心跳检测的原理,紧接着概述本项目信号处理流程,另外本项目第一阶段通过matlab仿真验证算法的有效性,仿真源码可关注小编并私信可取。1.概述。

Poulen的博客 2万+

如何在STM32上5分钟搞定nanopb协议传输?附完整代码示例

本文提供了在STM32微控制器上快速集成nanopb协议传输的实战指南。通过详细的步骤,从.proto文件定义、代码生成到STM32CubeIDE项目移植,帮助开发者利用nanopb这一轻量级Protocol Buffers C语言实现,在5分钟内构建高效、跨平台的嵌入式设备通信框架,并附有完整的代码示例。

jwt8token的博客 839

JAVA_IllegalStateException(非法状态异常)

IllegalStateException: stream has already been operated upon or closed

weixin_45749407的博客 1262

毫米波雷达之CFAR 目标检测

恒虚警率(CFAR)算法是一种广泛应用于雷达目标检测的算法,其主要目 标是减少由于杂波与回波之间强度不对称而引起的误报,以确保相对恒定的虚警 率。如图 3.4(a)所示,表示由距离单元组成的一维数据。在待测单元 D 周围选 择若干个背景杂波功率的蓝色单元构成参考滑窗,称为参考单元;而待测单元 D 相邻的若干个不用于背景估计的单元则称为保护单元。当参考单元和保护单元的 维度从一维扩展到二维时,相应的 CFAR 检测由一维 CFAR 演变为二维 CFAR 以处理参考窗口,如图 3.4 (b)所示。

m0_56120826的博客 4922

Java Stream API中Duplicate Key异常:从根源解析到架构级解决方案

在Java集合框架中,Map数据结构要求键(Key)必须唯一,这是其核心设计原理。当使用Stream API进行数据转换时,若出现重复键,会抛出IllegalStateException异常,这体现了快速失败(Fail-Fast)的设计原则,旨在避免数据静默覆盖导致业务逻辑错误。从技术价值看,正确处理键冲突是保障数据一致性和系统健壮性的关键。在数据处理、ETL流水线及微服务架构等应用场景中,开发者常需将List转换为Map以提升查询效率。本文聚焦于使用Collectors.toMap和groupingBy时

weixin_30521161的博客 337

DELL SC存储扩容避坑指南:6Gb vs 12Gb扩展柜混插的真相

本文深入解析DELL SC存储扩容中6Gb与12Gb扩展柜混插的核心规则与性能影响。文章指出,从SCOS 7.3版本起允许混插,但整个SAS环路速率将降至最低设备水平,尤其在12Gb控制器上接入6Gb扩展柜会严重拖累性能。指南提供了清晰的兼容性矩阵、实战操作流程及关键避坑清单,帮助管理员安全、高效地完成存储扩容。

weixin_28314575的博客 459

智驾芯片&软件分层&测试

智能驾驶相关的芯片,软件分层,测试相关内容

天赐好车的博客 437

关闭服务时spring-cloud-stream-binder-rockermq报java.lang.IllegalStateException: Shutdown in progress

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

weixin_43244686的博客 1074

HiCMAE 论文复现:基于 RAVDESS 数据集的音视频情感识别

多模态情感识别是人工智能领域的重要研究方向,旨在通过结合多种感知模态(如音频、视频、文本等)来更准确地识别人类情感状态。与传统单模态方法相比,多模态方法能够利用不同模态间的互补信息,提高情感识别的鲁棒性和准确性。 RAVDESS(Ryerson Audio-Visual Database of Emotional Speech and Song)是一个常用的多模态情感识别数据集,包含24位专业演员(12名男性,12名女性)表达的8种情感状态(中性、平静、快乐、悲伤、愤怒、恐惧、厌恶和惊讶)的音视频数据。

max500600的博客 498

Java Stream流编程核心概念与性能优化实践

Stream流是Java 8引入的函数式数据处理抽象,通过流水线操作实现高效集合处理。其核心原理基于延迟执行和短路优化,能显著提升大数据量场景下的处理效率。在工程实践中,Stream通过parallelStream()支持并行计算,配合filter/map/reduce等操作符实现声明式编程。典型应用场景包括数据清洗、批量处理和实时计算,特别适合与Spring、Kafka等框架集成。性能测试表明,在10万级以上数据规模时,并行流处理速度可达传统循环的4-10倍。开发时需注意操作顺序优化、避免装箱开销和线程安

weixin_33804582的博客 471

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java Stream API原理与实战避坑指南

Java Stream是Java 8引入的声明式集合处理机制,本质为惰性求值的计算管道,通过filter、map、collect等中间与终止操作实现函数式数据转换。其核心价值在于提升代码可读性、可测试性及并行扩展能力,广泛应用于电商实时计算、金融风控引擎和IoT数据聚合等高并发场景。但误用易引发ConcurrentModificationException、内存泄漏、性能反模式等问题。本文结合Stream生命周期、并行原理与12个线上血泪教训,系统解析filter和parallelStream等关键热词背后

weixin_33713707的博客 414

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

记录一次:UT010034: Stream not in async mode

java.lang.IllegalStateException: UT010034: Stream not in async mode

hq091117的博客 1227

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Spring WebSocket 并发发送消息异常:3种方案对比与 Tomcat 状态机源码解析

本文深入解析Spring WebSocket在高并发场景下发送消息时出现的`TEXT_PARTIAL_WRITING`状态异常问题,通过分析Tomcat状态机原理,对比三种解决方案:同步锁、ConcurrentWebSocketSessionDecorator和事件队列方案,并提供性能数据和选型建议,帮助开发者优化实时通信系统。

weixin_33842304的博客 403

Spring Boot注解实现条件工作流:告别复杂if-else分支

在业务系统开发中,条件分支逻辑的维护常随着复杂度增加而变得困难。传统if-else嵌套不仅影响代码可读性,也违背开闭原则。基于Spring Boot和SpEL表达式,我们可以通过自定义注解将条件声明与业务逻辑解耦,由轻量引擎统一调度条件方法,从而实现可扩展的条件工作流。这种注解驱动方式以规则表达式为核心,支持数值比较、字符串判断与多条件组合,适合订单审批、营销策略分发等场景。它既能减少分支缠绕,又便于单元测试与动态扩展,是介于简单if-else与重型工作流引擎之间的务实工程实践。理解其核心概念与实现原理,有

weixin_34034261的博客 350

2024年Java设计模式实战指南:从SOLID原则到Spring源码剖析

设计模式是面向对象编程中解决常见问题的经典方案,其核心在于提升代码的可复用性、可扩展性和可维护性。从原理层面看,设计模式基于SOLID等核心设计原则,通过封装变化、降低耦合来实现软件设计的灵活性。在技术价值上,掌握设计模式能帮助开发者深入理解主流框架底层机制,提升系统架构能力。尤其在微服务、云原生等现代架构中,设计模式的应用更为关键。本文以Spring框架为例,剖析了工厂模式在IoC容器、观察者模式在事件驱动、模板方法模式在JdbcTemplate中的具体实现,并结合电商支付、订单处理等实战场景,展示了策略

weixin_34082695的博客 411

Spring MVC功能配置示例

Spring MVC的配置应用示例

onePlus5T的博客 543

Spring Boot @RequestBody注解深度解析:从原理到实战避坑指南

在Web开发中,HTTP请求体数据的处理是前后端交互的核心环节。其基本原理是通过消息转换器(HttpMessageConverter)将不同格式的请求体内容反序列化为后端编程语言的对象,实现数据绑定。这一技术价值在于统一了数据入口,简化了开发,并支撑了RESTful API的设计。在实际应用场景中,开发者常需处理JSON、XML等多种数据格式,并确保类型安全与校验。本文聚焦于Spring Boot框架中的@RequestBody注解,深入剖析其内部工作机制,涵盖消息转换器遴选、反序列化流程及与校验注解的协同

weixin_33743880的博客 617
上一篇: 使用Spring实现异常统一处理【二】
下一篇: 使用Spring实现异常统一处理【四】--error-page中对异常进行log
lld2002
博客等级 码龄19年 15粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值