踩坑记录

在使用Jeepay开源支付系统项目中有一个读取HttpServletRequest流的方法,我把这个方法用在基于此系统二次开发的SpringBoot项目中结果陷入死循环。

经过很久很久很久很久很久的测试,发现这个方法用在SpringBoot项目有问题,现在将这个坑记录下来。

原始方案

SpringMVC中HttpServletRequest读取流的方法,该方法在SpringBoot中调用会陷入死循环

    /**
     * JSON 格式通过请求主体(BODY)传输  获取参数
     */
    public String getReqParamFromBody() {

        String body = "";

        if (isConvertJSON()) {

            try {
                String str;
                while ((str = request.getReader().readLine()) != null) {
                    body += str;
                }

                return body;

            } catch (Exception e) {
                log.error("请求参数转换异常! params=[{}]", body);
                throw new ServiceException("转换异常", ApiCodeEnum.PARAMS_ERROR.getCode());
            }
        } else {
            return body;
        }
    }

解决办法

在SpringBoot项目中建立缓冲流(BufferedReader)读取

    /**
     * JSON 格式通过请求主体(BODY)传输  获取参数
     */
    public String getReqParamFromBody() {

        StringBuilder body = new StringBuilder();

        if (isConvertJSON()) {

            try {
                BufferedReader in = new BufferedReader(new InputStreamReader(request.getInputStream()));
                String str;
                while ((str = in.readLine()) != null) {
                    body.append(str);
                }

                return body.toString();

            } catch (Exception e) {
                log.error("请求参数转换异常! params=[{}]", body.toString());
                throw new ServiceException("转换异常", ApiCodeEnum.PARAMS_ERROR.getCode());
            }
        } else {
            return body.toString();
        }
    }