Skip to content

Commit 00a29c3

Browse files
authored
Additionalpropertiesfalse generates invalid java code with mapstring (#369)
* Fix: Handle additionalProperties false correctly - do not generate Map field When additionalProperties is explicitly set to false, the generator should not create a Map field. Previously, any presence of additionalProperties would generate a Map regardless of its boolean value. Changes: - ModelBuilder.java: Updated processAdditionalProperties() to check if boolean false and skip Map generation - ModelBuilder.java: Updated setFieldType() to handle boolean false case - ModelBuilder.java: Updated getMapTypeObject() to safely handle boolean nodes - Added testAdditionalPropertiesFalse test case with YAML, expected DTO, and API - Bump patch version to 6.3.2 (bug fix) Fixes issue #367: additionalProperties false generates invalid Java code" * Add testing * fix case issue on tests
1 parent 63598fd commit 00a29c3

File tree

9 files changed

+1075
-1320
lines changed

9 files changed

+1075
-1320
lines changed

multiapi-engine/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
<groupId>com.sngular</groupId>
66
<artifactId>multiapi-engine</artifactId>
7-
<version>6.3.1</version>
7+
<version>6.3.2</version>
88
<packaging>jar</packaging>
99

1010
<properties>

multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/ModelBuilder.java

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -539,13 +539,17 @@ private static List<SchemaFieldObject> processAdditionalProperties(
539539
final var fieldObjectArrayList = new ArrayList<SchemaFieldObject>();
540540

541541
final var addPropObj = ApiTool.getAdditionalProperties(schema);
542-
if (TypeConstants.isBoolean(addPropObj.asText())) {
543-
fieldObjectArrayList
544-
.add(SchemaFieldObject
545-
.builder()
546-
.baseName(fieldName)
547-
.dataType(SchemaFieldObjectType.fromTypeList(TypeConstants.MAP, TypeConstants.OBJECT))
548-
.build());
542+
if (Objects.nonNull(addPropObj) && addPropObj.isBoolean()) {
543+
if (addPropObj.asBoolean()) {
544+
fieldObjectArrayList
545+
.add(SchemaFieldObject
546+
.builder()
547+
.baseName(fieldName)
548+
.dataType(SchemaFieldObjectType.fromTypeList(TypeConstants.MAP, TypeConstants.OBJECT))
549+
.build());
550+
} else {
551+
return fieldObjectArrayList;
552+
}
549553
} else if (ApiTool.hasRef(addPropObj)) {
550554
final String refSchemaName = MapperUtil.getPojoNameFromRef(addPropObj, specFile, null);
551555
fieldObjectArrayList.add(processRef(fieldName, addPropObj,
@@ -633,12 +637,20 @@ private static void setFieldType(
633637
field.setDataType(SchemaFieldObjectType.fromTypeList(TypeConstants.ARRAY, typeArray));
634638
field.setImportClass(getImportClass(typeArray));
635639
} else if (ApiTool.hasAdditionalProperties(schemaProperty)) {
636-
final String typeObject = getMapTypeObject(schemaProperty, specFile);
637-
field.setDataType(SchemaFieldObjectType.fromTypeList(TypeConstants.MAP, typeObject));
638-
field.setImportClass(getImportClass(typeObject));
639-
640+
final JsonNode apNode = ApiTool.getAdditionalProperties(schemaProperty);
641+
if (Objects.nonNull(apNode) && apNode.isBoolean()) {
642+
if (apNode.asBoolean()) {
643+
final String typeObject = TypeConstants.OBJECT;
644+
field.setDataType(SchemaFieldObjectType.fromTypeList(TypeConstants.MAP, typeObject));
645+
field.setImportClass(getImportClass(typeObject));
646+
} // if boolean false -> do not set map type
647+
} else {
648+
final String typeObject = getMapTypeObject(schemaProperty, specFile);
649+
field.setDataType(SchemaFieldObjectType.fromTypeList(TypeConstants.MAP, typeObject));
650+
field.setImportClass(getImportClass(typeObject));
651+
}
640652
} else if (ApiTool.isObject(schemaProperty)) {
641-
var typeObject = ApiTool.getType(schemaProperty);
653+
String typeObject = ApiTool.getType(schemaProperty);
642654
if (ApiTool.hasRef(schemaProperty)) {
643655
typeObject = MapperUtil.getPojoNameFromRef(schema, specFile, null);
644656
}
@@ -649,10 +661,10 @@ private static void setFieldType(
649661

650662
private static String getMapTypeObject(final JsonNode schema, final CommonSpecFile specFile) {
651663
final String type;
652-
if (ApiTool.isBoolean(ApiTool.getAdditionalProperties(schema))) {
664+
final JsonNode additionalProperties = ApiTool.getAdditionalProperties(schema);
665+
if (Objects.nonNull(additionalProperties) && additionalProperties.isBoolean()) {
653666
type = TypeConstants.OBJECT;
654667
} else {
655-
final JsonNode additionalProperties = ApiTool.getAdditionalProperties(schema);
656668
if (ApiTool.hasRef(additionalProperties)) {
657669
type = MapperUtil.getPojoNameFromRef(additionalProperties, specFile, null);
658670
} else if (ApiTool.isObject(schema)) {

0 commit comments

Comments
 (0)