zoukankan      html  css  js  c++  java
  • @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.*.*.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对象为空

    
    
  • 相关阅读:
    OC基础框架
    协议代理
    内存管理
    重写init或自定义init方法
    iOS输入框UITextField输入限制
    iOS 打包FrameWork
    iOS 持续往文件写入数据。
    ld: library not found for -lxxx 问题的解决办法
    iOS 侧滑返回过程中导航栏的黑色问题解决办法
    iOS 蓝牙分包发送数据
  • 原文地址:https://www.cnblogs.com/dennyzhangdd/p/7780221.html
Copyright © 2011-2022 走看看