Skip to content

[BUG][SPRING] Incorrect @JsonTypeName generated for oneOf discriminator mapping regression in 7.23.0 #24198

Description

@vmjaws

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.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions