Description
After upgrading from OpenAPI Generator 7.12.0 to 7.23.0, the generated Spring models produce inconsistent Jackson polymorphic annotations.
The generated base interface correctly uses the discriminator mapping value:
@JsonSubTypes({
@JsonSubTypes.Type(
value = PickupDeliveryRequest.class,
name = "pickupDelivery"
)
})
However, the generated subtype is annotated with:
@JsonTypeName("PickupDeliveryRequest")
instead of
@JsonTypeName("pickupDelivery")
Because Jackson serializes using @JsonTypeName, the generated model serializes to:
{
"requestType": "PickupDeliveryRequest",
"pickupLocation": "STORE001"
}
instead of the discriminator mapping value:
{
"requestType": "pickupDelivery",
"pickupLocation": "STORE001"
}
As a result, the generated models cannot be deserialized correctly by the generated API and Spring returns HttpMessageNotReadableException (400 Bad Request).
Changing the generated annotation manually to
@JsonTypeName("pickupDelivery")
fixes the problem immediately.
This worked correctly with OpenAPI Generator 7.12.0.
openapi-generator version
Working: 7.12.0
Broken: 7.23.0
OpenAPI declaration
openapi: 3.0.3
info:
title: Discriminator Regression
version: 1.0.0
paths:
/delivery:
put:
operationId: setDelivery
requestBody:
required: true
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/PickupDeliveryRequest'
discriminator:
propertyName: requestType
mapping:
pickupDelivery: '#/components/schemas/PickupDeliveryRequest'
responses:
"204":
description: OK
components:
schemas:
SetDeliveryModeRequest:
type: object
required:
- requestType
properties:
requestType:
type: string
PickupDeliveryRequest:
allOf:
- $ref: '#/components/schemas/SetDeliveryModeRequest'
- type: object
required:
- pickupLocation
properties:
pickupLocation:
type: string
Generation Details
Generator:
spring
Generator options:
documentationProvider=springdoc
useSpringBoot4=true
useJackson3=true
Steps to reproduce
Generate the Spring models.
Inspect the generated classes.
Generated base interface:
@JsonSubTypes({
@JsonSubTypes.Type(
value = PickupDeliveryRequest.class,
name = "pickupDelivery"
)
})
Generated subtype:
@JsonTypeName("PickupDeliveryRequest")
Serialize
new PickupDeliveryRequest("pickupDelivery", "STORE001")
Actual JSON:
{
"requestType": "PickupDeliveryRequest",
"pickupLocation": "STORE001"
}
Expected JSON:
{
"requestType": "pickupDelivery",
"pickupLocation": "STORE001"
}
Changing
@JsonTypeName("PickupDeliveryRequest")
to
@JsonTypeName("pickupDelivery")
causes serialization to work correctly.
Related issues/PRs
I searched for discriminator-related issues but could not find one describing this specific regression where the generated @JsonSubTypes.Type(name=...) and @JsonTypeName(...) disagree.
Description
After upgrading from OpenAPI Generator 7.12.0 to 7.23.0, the generated Spring models produce inconsistent Jackson polymorphic annotations.
The generated base interface correctly uses the discriminator mapping value:
However, the generated subtype is annotated with:
@JsonTypeName("PickupDeliveryRequest")instead of
@JsonTypeName("pickupDelivery")Because Jackson serializes using @JsonTypeName, the generated model serializes to:
instead of the discriminator mapping value:
{
As a result, the generated models cannot be deserialized correctly by the generated API and Spring returns HttpMessageNotReadableException (400 Bad Request).
Changing the generated annotation manually to
@JsonTypeName("pickupDelivery")fixes the problem immediately.
This worked correctly with OpenAPI Generator 7.12.0.
openapi-generator version
Working: 7.12.0
Broken: 7.23.0
OpenAPI declaration
Generation Details
Generator:
spring
Generator options:
Steps to reproduce
Generate the Spring models.
Inspect the generated classes.
Generated base interface:
Generated subtype:
Actual JSON:
Expected JSON:
Changing
@JsonTypeName("PickupDeliveryRequest")to
@JsonTypeName("pickupDelivery")causes serialization to work correctly.
Related issues/PRs
I searched for discriminator-related issues but could not find one describing this specific regression where the generated @JsonSubTypes.Type(name=...) and @JsonTypeName(...) disagree.