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_10_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:740)
at com.alibaba.fastjson.JSON.toJSONString(JSON.java:678)
at com.alibaba.fastjson.JSON.toJSONString(JSON.java:643)
出现问题的场景:拦截类中打印请求参数,并用JSONObject将 转化HttpServletResponse为字符串。
private Object printLog(ProceedingJoinPoint joinPoint) throws Throwable {
String ipAddress = IpAddressUtil.getIpAddress(request);
String url = request.getRequestURL().toString();
String params = JSON.toJSONString(joinPoint.getArgs());
Object proceed = joinPoint.proceed();
String result = JSON.toJSONString(proceed);
log.info("\n-----------------------------------------------------------------------------------------------" +
"\n<> IP:{} " +
"\n<> url:{} " +
"\n<> params:{} " +
"\n<> result:{}" +
"\n-----------------------------------------------------------------------------------------------" , ipAddress, url, params, result);
return proceed;
}
引发问题:接口有两个参数,其中一个是HttpservletResponse
这个时候拦截器在打印参数的时候就会报错。
debug 查看时,发现是在反射获取对象后,调用getWriter出错,导致json转化异常
alibaba json 在获取对象序列化类 ASMserializer_1_ResposeFacade 调用了 ResponseFacade.getWriter()
write javaBean error, fastjson version 1.2.58, class com.sun.proxy.$Proxy128, method : getWriter
错误用法代码:
HttpServletResponse response;
JSON.toJSONString(response);
总结一下,就是JSONObject没办法序列化HttpServletResponse,从而报了上述异常