必需参数异常在Spring Boot 2.x中不起作用

问题描述 投票:0回答:1

在我的Spring Boot应用程序中,我试图处理Required parameter异常。这个问题可能重复。但是发布的答案对我没有帮助。

我的控制器

 @GetMapping("/test")
    public ObjectId test(@RequestBody OIdLGroupIds OIdLGroupIds,@RequestParam ObjectId _id){
        return videoService.test();
    }

我的全局异常处理程序如下。

@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

@ExceptionHandler(Exception.class)
public final ResponseEntity<Object> handleAllExceptions(Exception ex, WebRequest request) {
    List<String> details = new ArrayList<>();
    details.add(ex.getLocalizedMessage());
    ErrorResponse error = new ErrorResponse("Server Error", details);
    return new ResponseEntity(error, HttpStatus.INTERNAL_SERVER_ERROR);
}

@ExceptionHandler(NotFoundHandler.class)
public final ResponseEntity<Object> handleRecordNotFoundException(NotFoundHandler ex, WebRequest request) {

    Map<String, Object> body = new LinkedHashMap<>();
    body.put("timestamp", LocalDateTime.now());
    body.put("message", "Record not found");

    List<String> details = new ArrayList<>();
    details.add(ex.getLocalizedMessage());
    ErrorResponse error = new ErrorResponse("Record Not Found", details);
    return new ResponseEntity(error, HttpStatus.NOT_FOUND);
}

@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(
        MethodArgumentNotValidException ex, HttpHeaders headers,
        HttpStatus status, WebRequest request) {

    Map<String, Object> body = new LinkedHashMap<>();
    body.put("timestamp", LocalDate.now());
    body.put("status", status.value());

    Set<String> errors = ex.getBindingResult()
            .getFieldErrors()
            .stream()
            .map(x -> x.getDefaultMessage())
            .collect(Collectors.toSet());

    body.put("details", errors);

    return new ResponseEntity<>(body, HttpStatus.BAD_REQUEST);
    }
}

它不会抛出任何细节(正文为空)。但是响应状态为400 Bad Request但是当我注释上述所有代码时,它将引发带有正文的默认异常。

我也尝试过这个

@Override
protected ResponseEntity<Object> handleMissingServletRequestParameter(MissingServletRequestParameterException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        String name = ex.getParameterName();
        System.out.println(name);
        logger.error(name + " parameter is missing");

        return super.handleMissingServletRequestParameter(ex, headers, status, request);
    }

我已经尝试了很多方法,但是没有运气。我有想念吗?请帮我。预先感谢。

spring spring-boot exception
1个回答
1
投票

空请求正文引发HttpMessageNotReadableException

@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

    @Override
    protected ResponseEntity<Object> handleMissingServletRequestParameter(MissingServletRequestParameterException ex,
        HttpHeaders headers, HttpStatus status, WebRequest request) {
        String name = ex.getParameterName();
        System.out.println(name);
        logger.error(name + " parameter is missing");

        return super.handleMissingServletRequestParameter(ex, headers, status, request);
    }

    @Override
    protected ResponseEntity<Object> handleHttpMessageNotReadable(
        HttpMessageNotReadableException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        System.out.println(ex.getMessage());
        logger.error("Request body is missing");

        return super.handleHttpMessageNotReadable(ex,  headers, status, request);
    }

}

如果允许空的正文,请使用@RequestBody(required = false)

© www.soinside.com 2019 - 2024. All rights reserved.