spring rest 处理空请求体(400 Bad Request)

新手上路,请多包涵

我正在使用 Spring4 开发一个 RESTful 应用程序。我想处理 POST 请求不包含正文的情况。我编写了以下自定义异常处理程序:

     @ControllerAdvice
    public class MyRestExceptionHandler {

      @ExceptionHandler
      @ResponseStatus(HttpStatus.BAD_REQUEST)
      public ResponseEntity<MyErrorResponse> handleJsonMappingException(JsonMappingException ex) {
          MyErrorResponse errorResponse = new MyErrorResponse("request has empty body");
          return new ResponseEntity<MyErrorResponse>(errorResponse, HttpStatus.BAD_REQUEST);
      }
      @ExceptionHandler(Throwable.class)
      public ResponseEntity<MyErrorResponse> handleDefaultException(Throwable ex) {
        MyErrorResponse errorResponse = new MyErrorResponse(ex);
        return new ResponseEntity<MyErrorResponse>(errorResponse, HttpStatus.BAD_REQUEST);
      }
    }

     @RestController
     public class ContactRestController{
        @RequestMapping(path="/contact", method=RequestMethod.POST)
        public void save(@RequestBody ContactDTO contactDto) {...}
     }

当它收到没有正文的 POST 时,不会调用这些方法。相反,客户端会收到带有 400 BAD REQUEST HTTP 状态和空主体的响应。有人知道如何处理吗?

原文由 rvit34 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

我解决了这个问题(自定义异常处理程序必须扩展 ResponseEntityExceptionHandler )。我的解决方案如下:

         @ControllerAdvice
        public class RestExceptionHandler extends ResponseEntityExceptionHandler {

            @Override
            protected ResponseEntity<Object> handleHttpMessageNotReadable(
                HttpMessageNotReadableException ex, HttpHeaders headers,
                HttpStatus status, WebRequest request) {
                // paste custom hadling here
            }
        }

原文由 rvit34 发布,翻译遵循 CC BY-SA 4.0 许可协议

就我而言,我需要处理所有具有无效参数的请求。所以我用 ResponseEntityExceptionHandler 扩展了我的课程并覆盖了方法 handleMissingServletRequestParameter 。您可以在类中找到自己定义的处理程序 ResponseEntityExceptionHandler

 @ControllerAdvice
public class YourExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(Exception.class)
    public final ResponseEntity handleAllExceptions(Exception ex) {
        // Log and return
    }

    @Override
    public ResponseEntity<Object> handleMissingServletRequestParameter(MissingServletRequestParameterException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        // Do your code here
        return new ResponseEntity<>("YOUR REQUEST PARAMS NOT MATCH!");
    }
}

原文由 Nguyen Minh Hien 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题