springMVC注解@RequestBody使用中出现HttpMessageNotReadableException:Required request body is missing异常原因与解决

记录一次联调中由于@RequestBody使用出现的小问题

使用@RequestBody注解 传参。如下代码

@RequestMapping(value = "synWorkOrderInfo",method = RequestMethod.POST,produces = "application/json;charset=UTF-8")
    public BaseResponse synWorkOrderInfo(@RequestBody WorkOrder workOrder) {
        // 参数校验
        if(null == workOrder){
            throw new BizException(OperationBizExceptionEnum.PARAM_ERROR, "工单参数不能为空,请仔细核对");
        }
        //***
        
        updateWorkOrderStatus(workOrder);
        response.setCharacterEncoding("UTF-8");
        return new BaseResponse<>();
    }

当接口未接收到参数时,框架HttpMessageNotReadableException:Required request body is missing异常

查看源码

springMVC注解@RequestBody使用中出现HttpMessageNotReadableException:Required request body is missing异常原因与解决_第1张图片

原来是框架做了一个类似非空的检查。

再去看@RequestBody注解定义会发现:

springMVC注解@RequestBody使用中出现HttpMessageNotReadableException:Required request body is missing异常原因与解决_第2张图片

缺省值是true。所以当参数为空时会抛异常。程序走不到业务代码中的校验。

那么解决方案就是修改这个属性,将其改成false。这样就能绕开框架的检查了。

 

修改之后就是

@RequestMapping(value = "synWorkOrderInfo",method = RequestMethod.POST,produces = "application/json;charset=UTF-8")
    public BaseResponse synWorkOrderInfo(@RequestBody(required = false) WorkOrder workOrder) {
        // 参数校验
        if(null == workOrder){
            throw new BizException(OperationBizExceptionEnum.PARAM_ERROR, "工单参数不能为空,请仔细核对");
        }
        //*****
        
        updateWorkOrderStatus(workOrder);
        response.setCharacterEncoding("UTF-8");
        return new BaseResponse<>();
    }

测试一下

springMVC注解@RequestBody使用中出现HttpMessageNotReadableException:Required request body is missing异常原因与解决_第3张图片

好了,就是这么个简单的问题。

你可能感兴趣的:(java,spring)