开发日志02(开发日志怎么看)

  本篇文章为你整理了开发日志02(开发日志怎么看)的详细内容,包含有开发日志是什么 开发日志怎么看 开发日志英文 开发日志框架 开发日志02,希望能帮助你了解 开发日志02。

   #springAop

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

  
在昨晚的开发中遇到了一个非常令人头疼的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)

   ............

  

 

  一开始是认为自己写的关于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

  以上就是开发日志02(开发日志怎么看)的详细内容,想要了解更多 开发日志02的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: