getWriter() has already been called for this response错误

来源:互联网 发布:外汇行情数据接口 编辑:程序博客网 时间:2024/06/05 23:39

在使用AOP时,出现了一个getWriter() has already been called for this response错误。
当时的代码是

    @Around (EDP)    public Object first(ProceedingJoinPoint joinPoint) throws Throwable {        Object[] args = joinPoint.getArgs();        AcceptData acceptData = null;        for (Object arg : args) {            if(arg instanceof AcceptData){                acceptData= (AcceptData) arg;                break;            }        }        PrintWriter out = null;        ServletRequestAttributes container=RequestContextHolder.getRequestAttributes();        HttpServletResponse response = container.getResponse ();        out = response.getWriter ();        if(acceptData==null){            out.print (JsonUtil.loadFalse ("签名错误"));            return null;        }        SystemInfo systemInfo = systemInfoService.getSystemInfo (appkey);        if(systemInfo==null){            out.print (JsonUtil.loadFalse (Constant.NOSYS));            return null;        }        int i=0;        for (Object arg : args) {            if(arg instanceof SystemInfo){                break;            }            i++;        }        args[i] = systemInfo;        Object proceed = joinPoint.proceed (args);        return  proceed;    }
@RestControllerpublic class CategoryController {      @RequestMapping(value = "findCategoryList")        public String findCategoryList(AcceptData acceptData,SystemInfo systemInfo){        List<VideoCategory> list = videoCategoryService.find(systemInfo,true);        return JsonUtil.loadTrue(list);    }}

错误原因:
@RestController是应该使用的ServletOutputStream进行发送数据的,而在之前我又实例化了PrintWrite

解决方法 1:不实例化PrintWrite,使用ServletOutputStream,在需要打印的地方使用write()方法

ServletOutputStream out = null;        ServletRequestAttributes servletContainer = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();        HttpServletResponse response = servletContainer.getResponse ();        out = response.getOutputStream ();        out.print (JsonUtil.loadFalse (Constant.NOSYS));

解决方法2:在执行方法前,调用response.reset ();

 response.reset (); Object proceed = joinPoint.proceed (args);

疑问:
1.在我实例化了PW后,我对PW进行flush,或者close后,ServletOutputStream也无法对数据进行传输。
2.ServletOutputStream的print()方法,会直接报错No message available。

2点多了,时间关系就没深究了。如有知道的请解惑 : )

阅读全文
0 0
原创粉丝点击