设为首页 加入收藏

TOP

开发日志02-解决`response`和SpringAop层相关冲突报错问题(一)
2023-07-25 21:42:39 】 浏览:58
Tags:02- 解决 response SpringAop 相关冲

解决一个Bug

在昨晚的开发中遇到了一个非常令人头疼的Bug

java.lang.IllegalStateException: getOutputStream() has already been called for this response

报错信息如下:有点长。。。

java.lang.IllegalStateException: getOutputStream() has already been called for this response
	at org.apache.catalina.connector.Response.getWriter(Response.java:584)
	at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:227)
	at com.alibaba.fastjson.serializer.ASMSerializer_2_ResponseFacade.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.JSONSerializer.write(JSONSerializer.java:285)
	at com.alibaba.fastjson.JSON.toJSONString(JSON.java:745)
	at com.alibaba.fastjson.JSON.toJSONString(JSON.java:683)
	at com.alibaba.fastjson.JSON.toJSONString(JSON.java:648)
	at com.sirc.modelservice.aop.ControllerAspect.logBeforeController(ControllerAspect.java:45)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:617)
	at org.springframework.aop.aspectj.AspectJMethodBeforeAdvice.before(AspectJMethodBeforeAdvice.java:44)
	at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:57)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
	at 
    ............

一开始是认为自己写的关于IO流的代码资源忘记关闭

自己检查两遍后确认没有问题

进入Debug模式

发现被调用接口根本就进不了对应方法

再次观察错误信息

#		at com.alibaba.fastjson.JSON.toJSONString(JSON.java:648)
......
#		at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)
.......
#			at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750)

大概猜到是fastJson包和SpringAop切面那里出了问题

果然,经过百度过后

发现fastjson内的方法使用了类似于out.write()等方法

//部分代码        
for(int var10 = 0; var10 < var9; ++var10) {
            SerializeFilter filter = var8[var10];
            serializer.addFilter(filter);
        }
    }
//this
    serializer.write(object);
    var15 = out.toString();
} finally {
    out.close();
}

这个和JSP中调用的response.getOutputStream()产生冲突.

即Servlet规范说明

不能既调用response.getOutputSt

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇学习笔记——拦截器与过滤器的区.. 下一篇98%的程序员,都没有研究过JVM重..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目