1. 程式人生 > >@RequestBody對象為空,異常Required request body is missing

@RequestBody對象為空,異常Required request body is missing

gateway row sock abs roc dap pri ont ==

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對象為空


 

@RequestBody對象為空,異常Required request body is missing