Skip to content

Commit c5ec3bf

Browse files
[release/10.0] Fix ModelMetadata null reference exception in emitted XMLComment transformers (#64401)
* OpenAPI: Fix ModelMetadata null reference exception in emitted XMLComment transformers When a route parameter does not have a bound model it would case a null reference exception because the ModelMetadata on the ParameterDescriptor was null. This is fixed by adding a null reference check Fixes #63757 * Change snapshots to utf-8 with bom As I think this was the encoding before my change * Rename controller test to allow adding it for minimal api's as well * Fix whitespace difference in OpenApi XML Source generator snapshot --------- Co-authored-by: Sjoerd van der Meer <[email protected]>
1 parent b98361f commit c5ec3bf

11 files changed

+673
-9
lines changed

src/OpenApi/gen/XmlCommentGenerator.Emitter.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,8 @@ public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransform
444444
foreach (var parameterDescription in context.Description.ParameterDescriptions)
445445
{
446446
var metadata = parameterDescription.ModelMetadata;
447-
if (metadata.MetadataKind == ModelMetadataKind.Property
447+
if (metadata is not null
448+
&& metadata.MetadataKind == ModelMetadataKind.Property
448449
&& metadata.ContainerType is { } containerType
449450
&& metadata.PropertyName is { } propertyName)
450451
{

src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/OperationTests.Controllers.cs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,4 +96,49 @@ await SnapshotTestHelper.VerifyOpenApi(compilation, document =>
9696
Assert.Equal("The todo to insert into the database.", path3.RequestBody.Description);
9797
});
9898
}
99+
100+
[Fact]
101+
public async Task SupportsRouteParametersFromControllers()
102+
{
103+
var source = """
104+
using Microsoft.AspNetCore.Builder;
105+
using Microsoft.AspNetCore.Mvc;
106+
using Microsoft.Extensions.DependencyInjection;
107+
108+
var builder = WebApplication.CreateBuilder();
109+
110+
builder.Services
111+
.AddControllers()
112+
.AddApplicationPart(typeof(TestController).Assembly);
113+
builder.Services.AddOpenApi();
114+
115+
var app = builder.Build();
116+
117+
app.MapControllers();
118+
119+
app.Run();
120+
121+
[ApiController]
122+
[Route("[controller]")]
123+
public class TestController : ControllerBase
124+
{
125+
/// <param name="userId">The id of the user.</param>
126+
[HttpGet("{userId}")]
127+
public string Get()
128+
{
129+
return "Hello, World!";
130+
}
131+
}
132+
133+
public partial class Program {}
134+
135+
""";
136+
var generator = new XmlCommentGenerator();
137+
await SnapshotTestHelper.Verify(source, generator, out var compilation);
138+
await SnapshotTestHelper.VerifyOpenApi(compilation, document =>
139+
{
140+
var path = document.Paths["/Test/{userId}"].Operations[HttpMethod.Get];
141+
Assert.Equal("The id of the user.", path.Parameters[0].Description);
142+
});
143+
}
99144
}

src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/AddOpenApiTests.CanInterceptAddOpenApi#OpenApiXmlCommentSupport.generated.verified.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,8 @@ public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransform
426426
foreach (var parameterDescription in context.Description.ParameterDescriptions)
427427
{
428428
var metadata = parameterDescription.ModelMetadata;
429-
if (metadata.MetadataKind == ModelMetadataKind.Property
429+
if (metadata is not null
430+
&& metadata.MetadataKind == ModelMetadataKind.Property
430431
&& metadata.ContainerType is { } containerType
431432
&& metadata.PropertyName is { } propertyName)
432433
{

src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/AdditionalTextsTests.CanHandleXmlForSchemasInAdditionalTexts#OpenApiXmlCommentSupport.generated.verified.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,8 @@ public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransform
455455
foreach (var parameterDescription in context.Description.ParameterDescriptions)
456456
{
457457
var metadata = parameterDescription.ModelMetadata;
458-
if (metadata.MetadataKind == ModelMetadataKind.Property
458+
if (metadata is not null
459+
&& metadata.MetadataKind == ModelMetadataKind.Property
459460
&& metadata.ContainerType is { } containerType
460461
&& metadata.PropertyName is { } propertyName)
461462
{

src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/CompletenessTests.SupportsAllXmlTagsOnSchemas#OpenApiXmlCommentSupport.generated.verified.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -553,7 +553,8 @@ public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransform
553553
foreach (var parameterDescription in context.Description.ParameterDescriptions)
554554
{
555555
var metadata = parameterDescription.ModelMetadata;
556-
if (metadata.MetadataKind == ModelMetadataKind.Property
556+
if (metadata is not null
557+
&& metadata.MetadataKind == ModelMetadataKind.Property
557558
&& metadata.ContainerType is { } containerType
558559
&& metadata.PropertyName is { } propertyName)
559560
{

0 commit comments

Comments
 (0)