springdoc生成具有多种媒体类型的openapi规范

kxxlusnw  于 2021-07-23  发布在  Java
关注(0)|答案(0)|浏览(587)

在我的spring项目中,我使用springdoc生成openapis规范文档。我用这些注解创建了api。我想用相同的端点url和不同的mediatype来处理不同对象的post。

@Validated
@Tag(name = "Calendar", description = "Api for Calendar resource")
public interface CalendarApi {

    @Operation(summary = "Add an appointment to the calendar", description = "Add an appointment to the calendar", tags = {"appointment"})
    @ApiResponses(value = {
            @ApiResponse(responseCode = "201", description = "Successful operation", content = @Content(mediaType = "application/json+widget", schema = @Schema(implementation = AppointmentWidgetDto.class))),
            @ApiResponse(responseCode = "400", description = "Invalid input")
    })
    @PostMapping(value = "/appointments", consumes = "application/json+widget")
    ResponseEntity<Appointment> saveFromWidget(@Parameter(description = "The new appointment to save", required = true) @Valid @RequestBody AppointmentWidgetDto appointmentDto);

    @Operation(summary = "Add an appointment to the calendar", description = "Add an appointment to the calendar", tags = {"appointment"})
    @ApiResponses(value = {
            @ApiResponse(responseCode = "201", description = "Successful operation", content = @Content(mediaType = "application/json", schema = @Schema(implementation = Appointment.class))),
            @ApiResponse(responseCode = "400", description = "Invalid input")
    })
    @PostMapping(value = "/appointments", consumes = MediaType.APPLICATION_JSON_VALUE)
    ResponseEntity<Appointment> save(@Parameter(description = "The new appointment to save", required = true) @Valid @RequestBody Appointment appointmentDto);

}

生成的开放式api规范文档是:

/api/v1/appointments:
    post:
      tags:
        - Calendar
      summary: Add an appointment to the calendar
      description: Add an appointment to the calendar
      operationId: save_1
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Appointment'
          application/json+widget:
            schema:
              $ref: '#/components/schemas/AppointmentWidgetDto'
        required: true
      responses:
        '201':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Appointment'
        '400':
          description: Invalid input
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/Appointment'

我有几个问题:
终结点名称没有意义(保存\u 1)
当我使用openapi生成器从这个规范生成angular客户机时,有一些警告阻止了这两种方法的生成。
[警告]在oas“content”部分找到多个模式,仅返回第一个模式(application/json)[警告]找到多个mediatypes,仅使用第一个
我知道这个问题已经解决了(https://github.com/openapitools/openapi-generator/issues/3990). 有没有办法允许在同一个端点url中发布两个不同的主体,并使用openapi生成器为不同的语言/平台创建客户端?
=======更新=======
本任命书的目的是:

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
public class AppointmentWidgetDto implements Serializable {
    @NotNull(message = "{appointment.store.missing}")
    @JsonDeserialize(using = StoreUriDeserializer.class)
    private Store store;

    @NotNull(message = "{appointment.title.missing}")
    @Size(max = 255)
    private String title;

    @Lob
    @Size(max = 1024)
    private String description;

    @Size(max = 50)
    private String type;

    @Size(max = 50)
    private String icon;

    @NotNull(message = "{appointment.startdate.missing}")
    private Instant startDate;

    @NotNull(message = "{appointment.enddate.missing}")
    private Instant endDate;

    @JsonDeserialize(using = ContactUriDeserializer.class)
    private Contact contact;

    @NotBlank(message = "{appointment.contactname.missing}")
    private String contactName;

    @NotBlank(message = "{appointment.email.missing}")
    @Email
    private String contactEmail;

    @NotBlank(message = "{appointment.phone.missing}")
    @PhoneNumber
    private String contactPhone;

}

这是预约:

@ScriptAssert(lang = "javascript", script = "_.startDate.isBefore(_.endDate)", alias = "_", reportOn = "endDate", message = "{appointment.invalid.end.date}")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
public class Appointment extends AbstractEntity {

    @NotNull(message = "{appointment.store.missing}")
    @JsonDeserialize(using = StoreUriDeserializer.class)
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "store_id", updatable = false)
    private Store store;

    @NotNull
    @Size(max = 255)
    @Column(nullable = false, length = 255)
    private String title;

    @Lob
    @Size(max = 1024)
    @Column(length = 1024)
    private String description;

    @Size(max = 30)
    @Column(length = 30)
    private String color;

    @Size(max = 50)
    @Column(length = 50)
    private String type;

    @Size(max = 50)
    @Column(length = 50)
    private String icon;

    @Size(max = 255)
    @Column(length = 255)
    private String location;

    @NotNull
    @Column(nullable = false)
    private Instant startDate;

    @NotNull
    @Column(nullable = false)
    private Instant endDate;

    @Builder.Default
    @NotNull
    @Column(nullable = false, columnDefinition = "BIT DEFAULT 0")
    private boolean allDay = false;

    @JoinColumn(name = "contact_id")
    @JsonDeserialize(using = ContactUriDeserializer.class)
    @ManyToOne(fetch = FetchType.LAZY)
    private Contact contact;

    private String contactName;

    @Email
    private String contactEmail;

    @PhoneNumber
    private String contactPhone;

    @JoinColumn(name = "agent_id")
    @JsonDeserialize(using = AgentUriDeserializer.class)
    @ManyToOne(fetch = FetchType.LAZY)
    private Agent agent;

    private String agentName;

    @Builder.Default
    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    @NotNull
    @Column(nullable = false)
    @Enumerated(EnumType.STRING)
    private AppointmentStatus status = AppointmentStatus.VALID;

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题