首页IT科技restful api接口规范 Get 带参数(开发日志02-解决`response`和SpringAop层相关冲突报错问题)

restful api接口规范 Get 带参数(开发日志02-解决`response`和SpringAop层相关冲突报错问题)

时间2025-06-20 14:28:12分类IT科技浏览7697
导读:解决一个Bug 在昨晚的开发中遇到了一个非常令人头疼的Bug...

解决一个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

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
租个主机(游戏主机出租靠谱吗,选择哪家出租游戏主机比较好)