首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
SAAS
ToB门户
了解全球最新的ToB事件
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
微博
Follow
记录
Doing
博客
Blog
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
排行榜
Ranklist
相册
Album
应用中心
qidao123.com ToB IT社区-企服评测·应用市场
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
开发日志02-解决`response`和SpringAop层相关冲突报错问 ...
返回列表
发新帖
开发日志02-解决`response`和SpringAop层相关冲突报错问题
[复制链接]
发表于 2023-2-22 15:39:23
|
显示全部楼层
|
阅读模式
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
解决一个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.getOutputStream(),又调用response.getWriter(),
于是就着手解决方案,因为团队技术
文档
需要这个切面来记录每次请求前的信息以及请求后的返回信息,并保存在
日志
中。
于是我就在想能不能在切面原本匹配的方法中,排除某一个方法
解决方案
@Pointcut("execution(public * x.x.x.controller.*.*(..))")
public void commonController(){}
@Pointcut("execution(public * x.x.x.controller.SqlController.export(..))")
public void excludeController() {
}
@Pointcut("commonController() && !excludeController()")
public void allPointcutWeb() {
}
复制代码
在定义切面的时候 单独匹配出需要排除的方法
并使用
@Pointcut("commonController() && !excludeController()")
复制代码
排除该方法
--最后
该操作要根据实际需求,本次需求的请求不携带任何信息,所以不需要环绕通知也可以。
如果你的方法确实需要环绕通知的话,可以尝试使用
ResponseEntity
-------谢谢 v
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复
使用道具
举报
返回列表
浏览过的版块
鸿蒙
欢乐狗
+ 我要发帖
登录后关闭弹窗
登录参与点评抽奖 加入IT实名职场社区
去登录
微信订阅号
微信服务号
微信客服(加群)
H5
小程序
快速回复
返回顶部
返回列表