@RequestBody对象为空,异常Required request body is missing
Posted on 2017-11-03 19:50 只会一点java 阅读(136464) 评论(4) 编辑 收藏 举报
正文
1.异常
org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing
2.问题复现:
@RequestMapping(value = "/somewhere", method = POST) public SomeResponse someHandler(@RequestBody XXXDTO xxxDTO) { ... } 当入参DTO对象为空时,
@RequestBody
对应http请求body,当请求body为空时,异常!
org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public com.rpc.common.Result<com.rpc.common.dto.PageDto<com.order.dto.OrderListDTO>> com.gateway.controller.OrderController.listOrder(com.*.*.order.dto.ListOrderPageDTO)
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:154)
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:128)
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121)
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:158)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:128)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
1 @Override 2 protected <T> Object readWithMessageConverters(NativeWebRequest webRequest, MethodParameter parameter, 3 Type paramType) throws IOException, HttpMediaTypeNotSupportedException, HttpMessageNotReadableException { 4 5 HttpServletRequest servletRequest = webRequest.getNativeRequest(HttpServletRequest.class); 6 ServletServerHttpRequest inputMessage = new ServletServerHttpRequest(servletRequest); 7 8 Object arg = readWithMessageConverters(inputMessage, parameter, paramType); 9 if (arg == null) { 10 if (checkRequired(parameter)) { 11 throw new HttpMessageNotReadableException("Required request body is missing: " + 12 parameter.getMethod().toGenericString()); 13 } 14 } 15 return arg; 16 } 17 18 protected boolean checkRequired(MethodParameter parameter) { 19 return (parameter.getParameterAnnotation(RequestBody.class).required() && !parameter.isOptional()); 20 }
看上图,最终是RequestBody注解的required属性。!parameter.isOptional()代表是否支持null,如果参数类型支持null,则是false,最终不用校验required.
1 public @interface RequestBody { 2 3 /** 4 * Whether body content is required. 5 * <p>Default is {@code true}, leading to an exception thrown in case 6 * there is no body content. Switch this to {@code false} if you prefer 7 * {@code null} to be passed when the body content is {@code null}. 8 * @since 3.2 9 */ 10 boolean required() default true; 11 12 }
看上图,默认是true.我们只需要@RequestBody (required=false)
3.解决方案:
1)@RequestBody (required=false)
2) 不要让DTO对象为空
------------------个人能力有限,大家多交流,一起壮哉我大JAVA!------------------
如果你觉得本文对你有点帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
标签:
疑难杂症
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器