diff --git a/metadata-service/openapi-servlet/src/main/java/io/datahubproject/openapi/v3/OpenAPIV3Generator.java b/metadata-service/openapi-servlet/src/main/java/io/datahubproject/openapi/v3/OpenAPIV3Generator.java index 349672ef2dcecc..44f50c1a8d10fd 100644 --- a/metadata-service/openapi-servlet/src/main/java/io/datahubproject/openapi/v3/OpenAPIV3Generator.java +++ b/metadata-service/openapi-servlet/src/main/java/io/datahubproject/openapi/v3/OpenAPIV3Generator.java @@ -725,13 +725,16 @@ private static Schema buildAspectsRefResponseSchema(final EntityRegistry entityR .description(ASPECT_DESCRIPTION) .required(List.of(PROPERTY_VALUE)); - entityRegistry - .getAspectSpecs() - .values() - .forEach( - aspect -> - result.addProperty( - PROPERTY_VALUE, new Schema<>().$ref(PATH_DEFINITIONS + aspect.getName()))); + // Create a list of reference schemas for each aspect + List aspectRefs = + entityRegistry.getAspectSpecs().values().stream() + .map(aspect -> new Schema<>().$ref(PATH_DEFINITIONS + toUpperFirst(aspect.getName()))) + .distinct() + .collect(Collectors.toList()); + + // Add the value property with oneOf constraint + result.addProperty(PROPERTY_VALUE, new Schema<>().oneOf(aspectRefs)); + result.addProperty( NAME_SYSTEM_METADATA, new Schema<>() diff --git a/metadata-service/openapi-servlet/src/test/java/io/datahubproject/openapi/v3/OpenAPIV3GeneratorTest.java b/metadata-service/openapi-servlet/src/test/java/io/datahubproject/openapi/v3/OpenAPIV3GeneratorTest.java index d8f04b60455abb..30b8d823605393 100644 --- a/metadata-service/openapi-servlet/src/test/java/io/datahubproject/openapi/v3/OpenAPIV3GeneratorTest.java +++ b/metadata-service/openapi-servlet/src/test/java/io/datahubproject/openapi/v3/OpenAPIV3GeneratorTest.java @@ -105,5 +105,30 @@ public void testOpenApiSpecBuilder() throws Exception { entry -> assertEquals( "#/components/schemas/BatchGetRequestBody", entry.getValue().get$ref())); + + // Assert aspect response schemas have value property with oneOf references + Schema aspectResponseSchema = + openAPI.getComponents().getSchemas().get("AspectsAspectResponse_v3"); + Schema valueProperty = aspectResponseSchema.getProperties().get("value"); + assertTrue( + valueProperty.getOneOf() != null && !valueProperty.getOneOf().isEmpty(), + "value property should use oneOf"); + + // Check each reference has proper format and capitalization + valueProperty + .getOneOf() + .forEach( + schema -> { + String ref = schema.get$ref(); + assertTrue( + ref != null && ref.startsWith("#/components/schemas/"), + "reference should start with '#/components/schemas/': " + ref); + + // Extract the last part after the last slash and check first character + String refName = ref.substring(ref.lastIndexOf('/') + 1); + assertTrue( + Character.isUpperCase(refName.charAt(0)), + "schema reference should start with capital letter: " + name); + }); } }