踩坑记录
在使用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();
}
}
评论