HttpMessageNotReadableException: Required request body is missing

使用 postman 请求服务异常:请求体消失

org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public com.xxx.demo.common.JsonRespModel<com.face.demo.model.base.PageResultModel<com.xxx.demo.model.FreshMenSigned>> com.xxx.demo.controller.FreshMenController.getFreshMenSignedList(com.xxx.demo.model.search.FreshMenSearch) throws java.lang.Exception
	at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:161)
	at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:131)
	at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121)
	at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:167)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134)
	......

因为服务端接口声明 @RequestBody 从消息体中获取客户端参数信息,一直未能获取到,我将 @RequestBody 去掉就好使了。当然不可能将其删除,根据提示源码问题位置分析。

从源码提示错误位置分析:Object arg = readWithMessageConverters(inputMessage, parameter, paramType) 读取转换后的 Object arg 值为null, 就导致 org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing ,只能说明我请求的参数信息不规范所致。

package org.springframework.web.servlet.mvc.method.annotation;
public class RequestResponseBodyMethodProcessor{
  ...
	@Override
	protected <T> Object readWithMessageConverters(NativeWebRequest webRequest, MethodParameter parameter,
	      Type paramType) throws IOException, HttpMediaTypeNotSupportedException, HttpMessageNotReadableException {
	
	   HttpServletRequest servletRequest = webRequest.getNativeRequest(HttpServletRequest.class);
	   Assert.state(servletRequest != null, "No HttpServletRequest");
	   ServletServerHttpRequest inputMessage = new ServletServerHttpRequest(servletRequest);
	
	   Object arg = readWithMessageConverters(inputMessage, parameter, paramType);
	   if (arg == null && checkRequired(parameter)) {
	      throw new HttpMessageNotReadableException("Required request body is missing: " +
	            parameter.getExecutable().toGenericString(), inputMessage);
	   }
	   return arg;
	}
...
}

Header 声明的内容不规范,常见如下:

  • Content-Type :内容编码类型,客户端请求服务器端的数据格式;
  • Content-length:用于描述HTTP消息实体的传输长度;
  • Host: 指定访问站点
    举栗子:

主要针对一个IP对应多个域名的情况才有必要处理该参数,127.0.0.1
对应域名:http://server1、http://server2、http://server3,访问 http://server1
时,dns 解析IP:127.0.0.1,服务会根据 header 头部中 host 字段,使用 server1
这个域名的网站程序对请求做响应;

  • user-agent:访问者是通过什么工具来代理请求;
  • accept:内容编码类型,服务端响应客户端的数据格式;
  • accept-encoding:浏览器发给服务器,声明浏览器支持的编码类型;
  • connection:关于http 请求的是否保持长连接。
    错误的声明
    将其声明后,请求接口正常
    请求成功

学习记录,希望能帮到各位!如有不对,请指正

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值