-
Notifications
You must be signed in to change notification settings - Fork 10.5k
Closed
Labels
area-minimalIncludes minimal APIs, endpoint filters, parameter binding, request delegate generator etcIncludes minimal APIs, endpoint filters, parameter binding, request delegate generator etcfeature-openapi
Description
cc: @captainsafia
Nullable query parameters are not generated as nullable in OpenAPI Document, such as:
group.MapGet("long", (long? myLong) => { })
.WithName("NullableLong");becomes:
"get": {
"tags": [
"Nullable"
],
"operationId": "NullableLong",
"parameters": [
{
"name": "myLong",
"in": "query",
"schema": {
"type": "integer",
"format": "int64"
}
}
],
"responses": {
"200": {
"description": "OK"
}
}
}I believe the cause is line 745:
aspnetcore/src/OpenApi/src/Services/OpenApiDocumentService.cs
Lines 739 to 761 in 684e739
| private static Type GetTargetType(ApiDescription description, ApiParameterDescription parameter) | |
| { | |
| var bindingMetadata = description.ActionDescriptor.EndpointMetadata | |
| .OfType<IParameterBindingMetadata>() | |
| .SingleOrDefault(metadata => metadata.Name == parameter.Name); | |
| var parameterType = parameter.Type is not null | |
| ? Nullable.GetUnderlyingType(parameter.Type) ?? parameter.Type | |
| : parameter.Type; | |
| // parameter.Type = typeof(string) | |
| // parameter.ModelMetadata.Type = typeof(TEnum) | |
| var requiresModelMetadataFallbackForEnum = parameterType == typeof(string) | |
| && parameter.ModelMetadata.ModelType != parameter.Type | |
| && parameter.ModelMetadata.ModelType.IsEnum; | |
| // Enums are exempt because we want to set the IOpenApiSchema.Enum field when feasible. | |
| // parameter.Type = typeof(TEnum), typeof(TypeWithTryParse) | |
| // parameter.ModelMetadata.Type = typeof(string) | |
| var hasTryParse = bindingMetadata?.HasTryParse == true && parameterType is not null && !parameterType.IsEnum; | |
| var targetType = requiresModelMetadataFallbackForEnum || hasTryParse | |
| ? parameter.ModelMetadata.ModelType | |
| : parameter.Type; | |
| targetType ??= typeof(string); | |
| return targetType; |
Is there a historical reason for always unwrapping nullable parameter types?
Metadata
Metadata
Assignees
Labels
area-minimalIncludes minimal APIs, endpoint filters, parameter binding, request delegate generator etcIncludes minimal APIs, endpoint filters, parameter binding, request delegate generator etcfeature-openapi