在我的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;
暂无答案!
目前还没有任何答案,快来回答吧!