@@ -549,20 +549,46 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)
549549 if (fixJacksonJsonTypeInfoInheritance ) {
550550 // When fixJacksonJsonTypeInfoInheritance is true:
551551 // 1. Always set visible=true so Jackson can read the discriminator
552- // 2. For oneOf/anyOf patterns: ensure children have the discriminator property with default values
552+ // 2. For oneOf/anyOf patterns: add discriminator property to parent and children
553553 visibleTrue = true ;
554554
555- // Only add/modify discriminator property for oneOf/anyOf patterns
556- // For allOf patterns, the property is already inherited and handled elsewhere
555+ // For oneOf/anyOf patterns, add the discriminator property to the parent sealed class
556+ // This allows accessing the discriminator value from the parent type directly
557557 if (isOneOfOrAnyOfPattern ) {
558+ String discriminatorVarName = toVarName (discriminatorPropBaseName );
559+
560+ // Clear all merged properties from the oneOf parent - they belong to children only
561+ // We'll add back just the discriminator property
562+ owner .getVars ().clear ();
563+ owner .getRequiredVars ().clear ();
564+ owner .getOptionalVars ().clear ();
565+ owner .getAllVars ().clear ();
566+
567+ // Add discriminator property to parent
568+ CodegenProperty parentDiscriminatorProp = new CodegenProperty ();
569+ parentDiscriminatorProp .baseName = discriminatorPropBaseName ;
570+ parentDiscriminatorProp .name = discriminatorVarName ;
571+ parentDiscriminatorProp .dataType = "kotlin.String" ;
572+ parentDiscriminatorProp .datatypeWithEnum = "kotlin.String" ;
573+ parentDiscriminatorProp .required = true ;
574+ parentDiscriminatorProp .isNullable = false ;
575+ parentDiscriminatorProp .isReadOnly = false ;
576+
577+ owner .getVars ().add (parentDiscriminatorProp );
578+ owner .getRequiredVars ().add (parentDiscriminatorProp );
579+ owner .getAllVars ().add (parentDiscriminatorProp );
580+
581+ // Parent now has properties (just the discriminator)
582+ hasParentProperties = true ;
583+
584+ // Process children: mark discriminator as inherited and set default values
558585 for (CodegenDiscriminator .MappedModel mappedModel : owner .getDiscriminator ().getMappedModels ()) {
559586 CodegenModel childModel = allModelsMap .get (mappedModel .getModelName ());
560587 if (childModel != null ) {
561- // Check if child already has the discriminator property and set default value
562588 boolean hasDiscriminatorProp = false ;
563589 String discriminatorDefault = "\" " + mappedModel .getMappingName () + "\" " ;
564590
565- // Update existing discriminator property in all lists
591+ // Update existing discriminator property in all lists - mark as inherited
566592 for (CodegenProperty prop : childModel .getVars ()) {
567593 if (prop .getBaseName ().equals (discriminatorPropBaseName )) {
568594 hasDiscriminatorProp = true ;
@@ -571,6 +597,7 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)
571597 prop .datatypeWithEnum = "kotlin.String" ;
572598 prop .required = true ;
573599 prop .isNullable = false ;
600+ prop .isInherited = true ;
574601 }
575602 }
576603 for (CodegenProperty prop : childModel .getAllVars ()) {
@@ -580,6 +607,7 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)
580607 prop .datatypeWithEnum = "kotlin.String" ;
581608 prop .required = true ;
582609 prop .isNullable = false ;
610+ prop .isInherited = true ;
583611 }
584612 }
585613
@@ -592,6 +620,7 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)
592620 prop .datatypeWithEnum = "kotlin.String" ;
593621 prop .required = true ;
594622 prop .isNullable = false ;
623+ prop .isInherited = true ;
595624 propToMove = prop ;
596625 break ;
597626 }
@@ -608,26 +637,31 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)
608637 prop .dataType = "kotlin.String" ;
609638 prop .datatypeWithEnum = "kotlin.String" ;
610639 prop .isNullable = false ;
640+ prop .isInherited = true ;
611641 }
612642 }
613643
614- // If child doesn't have the discriminator property, add it as required
644+ // If child doesn't have the discriminator property, add it as required and inherited
615645 if (!hasDiscriminatorProp ) {
616646 CodegenProperty discriminatorProp = new CodegenProperty ();
617647 discriminatorProp .baseName = discriminatorPropBaseName ;
618- discriminatorProp .name = toVarName ( discriminatorPropBaseName ) ;
648+ discriminatorProp .name = discriminatorVarName ;
619649 discriminatorProp .dataType = "kotlin.String" ;
620650 discriminatorProp .datatypeWithEnum = "kotlin.String" ;
621651 discriminatorProp .defaultValue = discriminatorDefault ;
622652 discriminatorProp .required = true ;
623653 discriminatorProp .isNullable = false ;
624654 discriminatorProp .isReadOnly = false ;
655+ discriminatorProp .isInherited = true ;
625656
626- // Add to vars and requiredVars (required property with default value)
627657 childModel .getVars ().add (discriminatorProp );
628658 childModel .getRequiredVars ().add (discriminatorProp );
629659 childModel .getAllVars ().add (discriminatorProp );
630660 }
661+
662+ // Set parent constructor args for the discriminator property
663+ childModel .getVendorExtensions ().put ("x-parent-ctor-args" ,
664+ discriminatorVarName + " = " + discriminatorVarName );
631665 }
632666 }
633667 }
0 commit comments