@RequestBody对象为空,异常Required request body is missing

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.mljr.lease.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对象为空


 
时间: 2024-10-05 06:16:58

@RequestBody对象为空,异常Required request body is missing的相关文章

c#中判断对象为空的几种方式(字符串等)

(1)先了解几个与空类型相关的关键字和对象  Null : 关键字表示不引用任何对象的空引用,它是所有引用类型变量的默认值,在2.0版本之前也就只有引用变量类型可以为null,如(string a=null)但在c# 2.0版本之后,Net也引入了可以为Null的值类型,但变量在定义的时候方式有所不同,如:int ? a=null.详细看http://msdn.microsoft.com/zh-cn/library/1t3y8s4s.aspx.不在内存中开辟内存地址,可用于引用是否可用.  DB

Jersey + Spring 依赖注入出现 空异常

在使用rest风格和Spring的依赖注入做一个demo的时候.依赖注入 老是出现空异常.  The RuntimeException could not be mapped to a response, re-throwing to the HTTP container java.lang.NullPointerException 就是没有 注入过去... 网上查了查.终于找都一种办法了. http://www.cnblogs.com/qunyang/p/3328561.html 引用博主的原

javascript 判断变量 是否为空null,undefined, 空数组,空对象(空Object),字符串是否为空或全由空白字符组成,数字是否为0,布尔是否为false。

javascript 判断变量 是否为空null,undefined, 空数组,空对象,空Object,字符串是否为空或全由空白字符组成,数字是否为0,布尔是否为false.由于Object没有length用 Object.keys()适用于数组,对象 返回可枚举的实例属性名组成的数组来判断是否为空. 利用逻辑判断中or (||)只要有一项为真则不再计算下一个表达式 来实现不管传入的参数是何种类型.只要符合我对空的定义即返回true. 1 function IsNothing(e) { 2 va

Javascript 中判断对象为空

发现了一个巧妙的实现: 需要检查一个对象(Object)是否为空,即不包含任何元素.Javascript 中的对象就是一个字典,其中包含了一系列的键值对(Key Value Pair).检查一个对象是否为空,等价于检查对象中有没有键值对.写成代码,形如: if (isEmptyObject(obj)) { // obj is empty } else { // not empty } 至于 isEmptyObject 的实现,jQuery 中有一个很有想法的方式,请看代码: function i

JavaSE8基础 String 字符串为空与字符串对象为空

os :windows7 x64    jdk:jdk-8u131-windows-x64    ide:Eclipse Oxygen Release (4.7.0)        code: package jizuiku.t02; public class Demo01 { public static void main(String[] args) { String s1 = ""; //字符串为空.有对象,但是没内容 String s2 = null;//字符串对象为空.连对象

对象判空

obj.withContent() 判断对象是否不为空且有值 obj=null 判断对象为空,若初始化了实例,则对象是有值的,判空无效. obj.count>0 判断对象大小大于0,若对象为空,出错 原文地址:https://www.cnblogs.com/codecheng/p/11468661.html

javascript 判断对象为空

https://segmentfault.com/a/1190000002540486 很多人会误解 JavaScript应该是没有字典这个东西的. JavaScript如果说一个对象是空的,那么这个对象应该为null.比如:var obj = {}; 这个不能叫对象为空,你只能说这个对象没有属性.内存还占着呢.不信你可以typeof(obj)试试. 一般我们也不会像Python一样直接判断, 一般会看看里面有没有某个属性,比如obj.name 直接判断就可以了, 再者, 一般我们用这个东西,

javascript jquery 推断对象为空的方式

java中存在非常多空指针的问题,须要常常做预防和推断,如若不然,控制台出现恼人的异常,让人信心备受打击,早期敲代码的时候没有经验,不能依据异常信息找到问题的根源,唯一做的事情就是祈祷,千万别出现什么异常信息啊!如今碰到与问题,到希望异常信息越具体越好,但偏偏事与愿违,我们所採用的框架竟然把所有的异常所有throws 即使再controller获取也比較麻烦,一旦出现与预期不一样的结果,都不知道是哪里出了问题,调试起来确实不便. js中也是一样,尽管不会出现一大串异常代码,但控制台还是会有错误警

javascript jquery 判断对象为空的方式

java中存在很多空指针的问题,需要经常做预防和判断,如若不然,控制台出现恼人的异常,让人信心备受打击,早期写程序的时候没有经验,不能根据异常信息找到问题的根源,唯一做的事情就是祈祷,千万别出现什么异常信息啊!现在碰到与问题,到希望异常信息越详细越好,但偏偏事与愿违,我们所采用的框架居然把所有的异常全部throws 即使再controller获取也比较麻烦,一旦出现与预期不一样的结果,都不知道是哪里出了问题,调试起来确实不便. js中也是一样,虽然不会出现一大串异常代码,但控制台还是会有错误警告