From 07d48a55d4cfac24d5ef48b272e5b2692b1279d8 Mon Sep 17 00:00:00 2001 From: martincostello Date: Thu, 8 Aug 2024 14:36:35 +0100 Subject: [PATCH] Fix schemas for nullable properties Fix incorrect handling of schemas for nullable properties. Resolves #3013. --- .../JsonSerializerDataContractResolver.cs | 2 +- ...lidSwaggerJson_Basic_DotNet_6.verified.txt | 53 +++++++++++++++++++ ...lidSwaggerJson_Basic_DotNet_8.verified.txt | 53 +++++++++++++++++++ 3 files changed, 107 insertions(+), 1 deletion(-) diff --git a/src/Swashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/JsonSerializerDataContractResolver.cs b/src/Swashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/JsonSerializerDataContractResolver.cs index c048d970ed..3e2a6404aa 100644 --- a/src/Swashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/JsonSerializerDataContractResolver.cs +++ b/src/Swashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/JsonSerializerDataContractResolver.cs @@ -96,7 +96,7 @@ public DataContract GetDataContractForType(Type type) return DataContract.ForObject( underlyingType: effectiveType, - properties: GetDataPropertiesFor(type, out Type extensionDataType), + properties: GetDataPropertiesFor(effectiveType, out Type extensionDataType), extensionDataType: extensionDataType, jsonConverter: (value) => JsonConverterFunc(value, effectiveType)); } diff --git a/test/Swashbuckle.AspNetCore.IntegrationTests/SwaggerVerifyIntegrationTest.SwaggerEndpoint_ReturnsValidSwaggerJson_Basic_DotNet_6.verified.txt b/test/Swashbuckle.AspNetCore.IntegrationTests/SwaggerVerifyIntegrationTest.SwaggerEndpoint_ReturnsValidSwaggerJson_Basic_DotNet_6.verified.txt index 83ff3be810..ce88e0c243 100644 --- a/test/Swashbuckle.AspNetCore.IntegrationTests/SwaggerVerifyIntegrationTest.SwaggerEndpoint_ReturnsValidSwaggerJson_Basic_DotNet_6.verified.txt +++ b/test/Swashbuckle.AspNetCore.IntegrationTests/SwaggerVerifyIntegrationTest.SwaggerEndpoint_ReturnsValidSwaggerJson_Basic_DotNet_6.verified.txt @@ -726,6 +726,36 @@ x-purpose: test } }, + /Issue3013/Get: { + get: { + tags: [ + Issue3013 + ], + responses: { + 200: { + description: OK, + content: { + text/plain: { + schema: { + $ref: #/components/schemas/TestResponse + } + }, + application/json: { + schema: { + $ref: #/components/schemas/TestResponse + } + }, + text/json: { + schema: { + $ref: #/components/schemas/TestResponse + } + } + } + } + }, + x-purpose: test + } + }, /promotions: { get: { tags: [ @@ -1381,6 +1411,29 @@ }, additionalProperties: false }, + TestResponse: { + type: object, + properties: { + foo: { + $ref: #/components/schemas/TestStruct + } + }, + additionalProperties: false + }, + TestStruct: { + type: object, + properties: { + a: { + type: integer, + format: int32 + }, + b: { + type: integer, + format: int32 + } + }, + additionalProperties: false + }, Transaction: { required: [ amount diff --git a/test/Swashbuckle.AspNetCore.IntegrationTests/SwaggerVerifyIntegrationTest.SwaggerEndpoint_ReturnsValidSwaggerJson_Basic_DotNet_8.verified.txt b/test/Swashbuckle.AspNetCore.IntegrationTests/SwaggerVerifyIntegrationTest.SwaggerEndpoint_ReturnsValidSwaggerJson_Basic_DotNet_8.verified.txt index 07dc53bbcf..fbae1d65df 100644 --- a/test/Swashbuckle.AspNetCore.IntegrationTests/SwaggerVerifyIntegrationTest.SwaggerEndpoint_ReturnsValidSwaggerJson_Basic_DotNet_8.verified.txt +++ b/test/Swashbuckle.AspNetCore.IntegrationTests/SwaggerVerifyIntegrationTest.SwaggerEndpoint_ReturnsValidSwaggerJson_Basic_DotNet_8.verified.txt @@ -726,6 +726,36 @@ x-purpose: test } }, + /Issue3013/Get: { + get: { + tags: [ + Issue3013 + ], + responses: { + 200: { + description: OK, + content: { + text/plain: { + schema: { + $ref: #/components/schemas/TestResponse + } + }, + application/json: { + schema: { + $ref: #/components/schemas/TestResponse + } + }, + text/json: { + schema: { + $ref: #/components/schemas/TestResponse + } + } + } + } + }, + x-purpose: test + } + }, /promotions: { get: { tags: [ @@ -1381,6 +1411,29 @@ }, additionalProperties: false }, + TestResponse: { + type: object, + properties: { + foo: { + $ref: #/components/schemas/TestStruct + } + }, + additionalProperties: false + }, + TestStruct: { + type: object, + properties: { + a: { + type: integer, + format: int32 + }, + b: { + type: integer, + format: int32 + } + }, + additionalProperties: false + }, Transaction: { required: [ amount