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

在使用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;
    }
@RestController
public class CategoryController {
      @RequestMapping(value = "findCategoryList")
        public String findCategoryList(AcceptData acceptData,SystemInfo systemInfo){
        List 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。

你可能感兴趣的:(javaee)