Swagger必需的参数在缺少时返回500,而不是404

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swagger必需的参数在缺少时返回500,而不是404相关的知识,希望对你有一定的参考价值。

我有一个REST端点,该端点具有一个请求参数“ myParam”。这是一个必需参数,没有该参数时,对此端点发出的任何GET请求都将被视为错误请求。我正在使用Swagger突出显示需要此参数这一事实,如下所示

@ApiParam(required = true) @RequestParam(value = "myParam") String myParam

问题是,当我通过Postman向该端点提交GET时,返回的HTTP错误为500,表明未提供所需的参数myParam。有什么方法可以重构它,以便如果缺少按要求由Swagger标记的参数,则响应为404?

答案

解决方案可能是创建一个类,并使用@ControllerAdvice对其进行注释。此类的方法负责处理作为参数传递的特定异常。在您的500错误中,应该有一个异常堆栈跟踪,例如“由.. org.somepackage.SomeException ...”]造成的。

1)您可以创建一个包含消息和HttpStatus代码的自定义类:

public class ExceptionResponse 
  private HttpStatus httpStatus;
  private String errorMessage;
  //getters;setters;

2)带注释的@ControllerAdvice类应如下所示:

@ControllerAdvice
public class RestExceptionHandler 

@ExceptionHandler(value = SomeException.class)
public ResponseEntity<ExceptionResponse> handleMissingRequiredParameters(SomeException ex) 
    ExceptionResponse exceptionResponse = new ExceptionResponse();
    exceptionResponse.setHttpStatus(HttpStatus.BAD_REQUEST);
    exceptionResponse.setErrorMessage(ex.getMessage());
    return new ResponseEntity<>(exceptionResponse, exceptionResponse.getHttpStatus());


现在,当抛出SomeException时,您将看到的实际响应是带有自定义ExceptionResponsehttpStatuserrorMessage JSON。

以上是关于Swagger必需的参数在缺少时返回500,而不是404的主要内容,如果未能解决你的问题,请参考以下文章

compojure-api/schema/swagger 中的非必需参数?

Swagger API“必需” - 这需要多少?

Swagger UI 显示 camelCase 参数而不是 PascalCase

内部错误 (500) 是不是应该成为 Swagger API 文档的一部分?

将 Swagger 与 Django Rest Framework 一起使用,我可以在不同字段而不是一个正文中看到 POST 参数吗

ServiceStack 5.13.0 元数据和 swagger-ui 页面在 .NET 6 迁移后返回 500 错误