Skip to content

Commit f81c416

Browse files
authored
[core] Avoid NullPointerException when discriminator property allowableValues is null (#22177) (#25007)
* fix(core): avoid NPE when discriminator property allowableValues is null (#22177) * test(core): strengthen testSetEnumDiscriminatorDefaultValue assertions
1 parent 217dbbf commit f81c416

2 files changed

Lines changed: 64 additions & 1 deletion

File tree

‎modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3579,7 +3579,10 @@ protected static void setEnumDiscriminatorDefaultValue(CodegenModel model) {
35793579
*/
35803580
protected static String getEnumValueForProperty(
35813581
String modelName, CodegenDiscriminator discriminator, CodegenProperty var) {
3582-
if (!discriminator.getIsEnum() && !var.isEnum) {
3582+
if (var == null) {
3583+
return null;
3584+
}
3585+
if (discriminator == null || (!discriminator.getIsEnum() && !var.isEnum)) {
35833586
return var.defaultValue;
35843587
}
35853588
Map<String, String> mapping = Optional.ofNullable(discriminator.getMapping()).orElseGet(Collections::emptyMap);
@@ -3589,6 +3592,9 @@ protected static String getEnumValueForProperty(
35893592
return e.getKey();
35903593
}
35913594
}
3595+
if (var.allowableValues == null) {
3596+
return var.defaultValue;
3597+
}
35923598
Object values = var.allowableValues.get(ENUM_VALUES);
35933599
if (!(values instanceof List<?>)) {
35943600
return var.defaultValue;

‎modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java‎

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5540,4 +5540,61 @@ public void splitOperationsByContentTypeIsAGlobalOption() {
55405540
off.processOpts();
55415541
assertThat(off.splitOperationsByContentType).isFalse();
55425542
}
5543+
5544+
@Test
5545+
public void testGetEnumValueForPropertyWithNullAllowableValues() {
5546+
CodegenDiscriminator discriminator = new CodegenDiscriminator();
5547+
discriminator.setIsEnum(true);
5548+
CodegenProperty var = new CodegenProperty();
5549+
var.baseName = "type";
5550+
var.defaultValue = "defaultType";
5551+
var.allowableValues = null;
5552+
5553+
String result = DefaultCodegen.getEnumValueForProperty("TestModel", discriminator, var);
5554+
assertEquals("defaultType", result);
5555+
5556+
Assertions.assertNull(DefaultCodegen.getEnumValueForProperty("TestModel", discriminator, null));
5557+
assertEquals("defaultType", DefaultCodegen.getEnumValueForProperty("TestModel", null, var));
5558+
}
5559+
5560+
@Test
5561+
public void testSetEnumDiscriminatorDefaultValue() {
5562+
CodegenModel model = new CodegenModel();
5563+
model.name = "TestModel";
5564+
model.schemaName = "TestModel";
5565+
5566+
CodegenDiscriminator discriminator = new CodegenDiscriminator();
5567+
discriminator.setPropertyBaseName("type");
5568+
discriminator.setPropertyName("type");
5569+
discriminator.setIsEnum(true);
5570+
model.discriminator = discriminator;
5571+
5572+
CodegenProperty var = new CodegenProperty();
5573+
var.baseName = "type";
5574+
var.defaultValue = "defaultType";
5575+
var.allowableValues = null;
5576+
model.vars.add(var);
5577+
model.allVars.add(var);
5578+
5579+
// 1. With mapping defined and null allowableValues:
5580+
// Verifies the discriminator matching path executes and assigns mapped value without NPE
5581+
discriminator.setMapping(Map.of("CustomModel", "TestModel"));
5582+
DefaultCodegen.setEnumDiscriminatorDefaultValue(model);
5583+
assertEquals("CustomModel", var.defaultValue);
5584+
5585+
// 2. With allowableValues populated matching modelName:
5586+
// Verifies allowableValues matching path assigns the enum value
5587+
discriminator.setMapping(Collections.emptyMap());
5588+
var.allowableValues = Map.of(EnumVarMap.ENUM_VALUES, List.of("TestModel"));
5589+
var.defaultValue = "defaultType";
5590+
DefaultCodegen.setEnumDiscriminatorDefaultValue(model);
5591+
assertEquals("TestModel", var.defaultValue);
5592+
5593+
// 3. With null allowableValues and no mapping match:
5594+
// Verifies fallback to defaultValue runs safely without NPE (issue #22177)
5595+
var.allowableValues = null;
5596+
var.defaultValue = "defaultType";
5597+
DefaultCodegen.setEnumDiscriminatorDefaultValue(model);
5598+
assertEquals("defaultType", var.defaultValue);
5599+
}
55435600
}

0 commit comments

Comments
 (0)