springdoc-bug nestしたpolymorphismがうまく反映されなかった @Schema(description = "ルート詳細の1区間情報") @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") @JsonSubTypes( value = [ JsonSubTypes.Type(value = SectionRecord.Point::class, name = "point"), JsonSubTypes.Type(value = SectionRecord.Move::class, name = "move"), ] ) sealed class SectionRecord() { data class Point( val name: String, val coord: CoordinateRecord, @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") val departureTime: LocalDateTime? = null, @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") val arrivalTime: LocalDateTime? = null, val isFirstSpot: Boolean = false, val isLastSpot: Boolean = false, ) : SectionRecord() data class Move( val move: MoveTypeRecord, val distanceMeter: Int, val transitMinutes: Int, val transitFare: Int, @Schema(description = "駅等の入口名称等", example = "A3口") val entranceGateway: String? = null, @Schema(description = "駅等の出口名称", example = "6番口(赤レンガ倉庫口)") val exitGateway: String? = null, val transport: TransportRecord?, val directOperations: List<DirectOperationRecord> = listOf(), ) : SectionRecord() } @Schema(description = "直通区間の情報") @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") @JsonSubTypes( value = [ JsonSubTypes.Type(value = DirectOperationRecord.Point::class, name = "point"), JsonSubTypes.Type(value = DirectOperationRecord.Move::class, name = "move"), ] ) sealed class DirectOperationRecord() { data class Point( val name: String, val coord: CoordinateRecord, @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") val departureTime: LocalDateTime? = null, @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") val arrivalTime: LocalDateTime? = null, ) : DirectOperationRecord() data class Move( val move: MoveTypeRecord, val distanceMeter: Int, val transitMinutes: Int, val transitFare: Int, val transport: TransportRecord?, ) : DirectOperationRecord() } やっぱり書き方が正しくないっぽい… @Schema( description = "ルート詳細の1区間情報", oneOf = [SectionRecord.SectionPoint::class, SectionRecord.SectionMove::class], discriminatorProperty = "type", discriminatorMapping = [ DiscriminatorMapping(value = "point", schema = SectionRecord.SectionPoint::class), DiscriminatorMapping(value = "move", schema = SectionRecord.SectionMove::class), ], ) sealed class SectionRecord(val type: String) { data class SectionPoint( val name: String, val coord: CoordinateRecord, @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") val departureTime: LocalDateTime? = null, @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") val arrivalTime: LocalDateTime? = null, val isFirstSpot: Boolean = false, val isLastSpot: Boolean = false, ) : SectionRecord("point") data class SectionMove( val move: MoveTypeRecord, val distanceMeter: Int, val transitMinutes: Int, val transitFare: Int, @Schema(description = "駅等の入口名称等", example = "A3口") val entranceGateway: String? = null, @Schema(description = "駅等の出口名称", example = "6番口(赤レンガ倉庫口)") val exitGateway: String? = null, val transport: TransportRecord?, val directOperations: List<DirectOperationRecord> = listOf(), ) : SectionRecord("move") } @Schema( description = "ルート詳細の1区間情報", oneOf = [DirectOperationRecord.DirectOperationPoint::class, DirectOperationRecord.DirectOperationMove::class], discriminatorProperty = "type", discriminatorMapping = [ DiscriminatorMapping(value = "point", schema = DirectOperationRecord.DirectOperationPoint::class), DiscriminatorMapping(value = "move", schema = DirectOperationRecord.DirectOperationMove::class), ], ) sealed class DirectOperationRecord(val type: String) { data class DirectOperationPoint( val name: String, val coord: CoordinateRecord, @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") val departureTime: LocalDateTime? = null, @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") val arrivalTime: LocalDateTime? = null, ) : DirectOperationRecord("point") data class DirectOperationMove( val move: MoveTypeRecord, val distanceMeter: Int, val transitMinutes: Int, val transitFare: Int, val transport: TransportRecord?, ) : DirectOperationRecord("move") } これだとうまくいったので、JsonSubTypesで反映させるのは正しいやり方ではなかったみたい