接收方法:
解决方案:
先去掉@RequsetBody 因为使用@RequsetBody时,框架会调用HttpMessageConvert读取HttpRequest的InputStram反序列化为对象,这个InputStram只能读一次。 后续你的代码再通过Reader读输入流时,已经没有内容了,就会异常
然后用下面的方法手动去读http里面的字符串
//这个方法不会用到公司的框架,很彻底的解决了问题
public String getRequestString(ApiReq apiReq, HttpServletRequest request) {
String body = "";
try (InputStream inputStream = request.getInputStream()) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] bytes = new byte[1024];
int len;
while ((len = inputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, len);
}
body = outputStream.toString(request.getCharacterEncoding());
} catch (Exception e) {
e.printStackTrace();
// throw new BizException("M999", "华润通知读取失败:" + e.getMessage());
}
return body;
}
//这个方法会用到公司的框架
public String getRequestString2(ApiReq apiReq, HttpServletRequest request) {
StringBuilder body = new StringBuilder();
try (BufferedReader reader = request.getReader()) {
String line;
while ((line = reader.readLine()) != null) {
body.append(line);
}
} catch (Exception e) {
e.printStackTrace();
// throw new BizException("M999", "华润通知读取失败:" + e.getMessage());
}
return body.toString();
}
最后用的getRequestString方法,可以接受MIME为 json和Text 以及其他格式的字符串且不会自动忽略null