write javaBean error, fastjson version 1.2.76, class org.springframework.security.web.header.HeaderWriterFilter$HeaderWriterResponse, fieldName : response, write javaBean error, ......

问题描述

springboot+mybatisplus,excel导入导出功能的接口,本地测试正常,打包部署后报错如下:

write javaBean error, fastjson version 1.2.76, class org.springframework.security.web.header.HeaderWriterFilter$HeaderWriterResponse, fieldName : response, write javaBean error, fastjson version 1.2.76, class org.springframework.security.web.firewall.FirewalledResponse, fieldName : response, getOutputStream() has already been called for this response
Caused by: java.lang.IllegalStateException: getOutputStream() has already been called for this response
	at org.apache.catalina.connector.Response.getWriter(Response.java:581)
	at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:227)
	at com.alibaba.fastjson.serializer.ASMSerializer_3_ResponseFacade.write(Unknown Source)
	at com.alibaba.fastjson.serializer.FieldSerializer.writeValue(FieldSerializer.java:318)
	at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:475)
	... 131 more

原因梳理

在我这次问题的具体情境下,原因是复合的:

  1. 因本人只看到开发版本,打包工作交给别人完成,后发现拦截器等处代码不同步,因此看起来问题是开发和打包环境不同导致的,实际不然;
  2. 在网络上检索看到基本都是说接口的日志处理调用了getOutputStream()或者getWriter()导致的,但是排查代码看不出所以然;
  3. 本次项目使用的框架个人比较陌生,框架对导入导出等接口做了log的排除处理,但前提是方法的命名需要遵循框架制定的规则:
    @Pointcut("execution(* xxx.xxx.*..*Controller.*(..))" +
            " && !execution(* xxx.xxx.*..SysLoginController.login*(..)) "+
            " && !execution(* xxx.xxx.*..SysLoginController.*Login(..)) "+
            " && !execution(* xxx.xxx.*..*Controller.import*(..)) "+
            " && !execution(* xxx.xxx.*..*Controller.export*(..)) "+
            " && !execution(* xxx.xxx.*..SysFileController.*(..)) ")
    public void webLog() {
    }

就是说,导入和导出接口方法需要写成 importXxxx和exportXxxx的格式才可以被排除。这一点是通过观察框架给出的测试导入导出方法与我自己写的方法在控制台上输出不同才发现的,可以说是比较隐蔽了。

见上图,是通过观察上面四行输出才发现端倪。

根本原因

也许此类问题的根本原因往往就是接口的日志处理重复获取了response的文件流,在不同框架下可能表现不同。
对不熟悉的框架还是需要时间磨合_(:з」∠)_

posted @ 2022-12-08 23:55  宇宙野牛  阅读(2219)  评论(0编辑  收藏  举报