当前位置: 首页 > 知识库问答 >
问题:

Java和OpenAPI-根据响应代码返回不同的负载

孟修竹
2023-03-14

在开始之前:我查看了以下链接,但没有一个与我的问题相匹配:

  • Swagger-指定可选对象属性或多个响应
  • Swagger;根据可选参数指定两个具有相同代码的响应
  • Swagger-指定可选对象属性或多个响应

因此,我有一个endpoint的OpenAPI 3定义,该endpoint为成功调用返回给定的有效负载(例如,200ok)。但是,对于不成功的调用(例如,408冲突),我希望返回完全不同的错误负载。

你可以看到下面的定义:

openapi: 3.0.1

info:
  title: Dogs
  description: API to add dogs into a database
  version: 0.0.1

paths:
  /dog:
    post:
      description: Saves a dog into the database

      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Dog"

      responses:
        201:
          description: A dog was added to the system
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Dog"

        400:
          description: This dog already exist in the system
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

components:
  schemas:
    Dog:
      type: object
      properties:
        name:
          type: string
          description: Name of the dog
          example: "barky"

    Error:
      type: object
      properties:
        code:
          type: string
          description: Machine-readable code of the error.
          example: "Already Exists"

        message:
          type: string
          description: A Human-readable error message.
          example: "Empty string is not a valid name for a dog"

由此,我生成了一个Spring代码(目前使用的是Swagger编辑器)。与定义关联的方法签名如下所示:

ResponseEntity<Dog> dogPost(@ApiParam(value = ""  )  @Valid @RequestBody Dog body);

因此,除非在异常中抛出异常并捕获,否则我不能返回此函数中的错误对象,因为无效输入的操作也不例外,因此我认为这是一个错误的做法。

有没有一种方法可以很好地解决这个问题,而不会抛出异常并在函数范围之外捕获它?

共有1个答案

上官迪
2023-03-14

有很多方法可以通过Spring Boot实现这种需求。请参见使用它们中的一个异常代码https://www.baeldung.com/exception-handling-for-rest-with-spring更多信息),但这确实是在控制器本身之外处理的。该系统的优点是,您可以在1个位置实现任何异常到错误对象的转换,而不是单独实现每个控制器方法。

也就是说,如果您确实希望在控制器本身中处理它,您可以执行以下操作:

@PostRequest("/dog")
public ResponseEntity<?> createDog(@Valid @RequestBody Dog dog) {
    if( !service.doesDogAlreadyExist(dog) ) {
      Dog dog = service.createDog(dog);
      return ResponseEntity.ok(dog).build();
    } else {
      return ResponseEntity.status(HttpStatus.CONFLICT)
                           .body(/* error object here */)
    }
}
 类似资料:
  • 我使用curl获取http头以查找http状态代码并返回响应。我使用以下命令获取http头

  • 我们最近从springfox迁移到springdoc openapi 3。其中一个API返回大约2MB的数据,它在springfox中正常工作,但是springdoc openapi用户界面在几分钟内没有响应,渲染也需要2分钟以上。有什么办法可以解决吗?

  • 我想在Android应用程序发送包含 /api/Profile/Favorite的超文本传输协议请求时返回存根响应?value={"ID": 11821} 所以这是我的测试(使用WireMock框架) 但是当我开始测试方法测试发送请求浓缩咖啡时,我得到了正式服的生产响应。 这里请求来自Android设备: 这里回应: 正如你所看到的,我没有得到存根响应:{This_is_mock_response

  • 问题内容: 我正在尝试从URL获取InputStream。可以从Firefox打开URL。它返回一个json,并且我已经安装了一个插件以在Firefox中查看json,因此我可以在其中查看它。 所以我尝试通过以下方式从Java获取它: 但是它在urlConnection.getInputStream()中抛出IOException。 我也尝试过: 但是没有运气。 任何信息都是可观的。提前致谢。 问

  • 因为它创建了一个新的资源,所以如果它返回状态代码201是合适的,但目前它返回200。 我发现如何设置状态代码的唯一方法是让方法返回一个并在那里设置它,但我确实不希望我的所有接口返回一个泛型响应,而不是实际的响应对象(在本例中是)。

  • 我试图让ApacheHttpClient触发HTTP请求,然后显示HTTP响应代码(200404500等)以及HTTP响应正文(文本字符串)。需要注意的是,我使用的是因为大多数HttpClient示例都来自和API从版本3到版本4发生了巨大变化。 不幸的是,我只能让HttpClient返回状态代码或响应主体(但不是两者)。 这是我所拥有的: 所以我问:使用库,如何从同一