接收方法:
解决方案:
先去掉@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