-
Notifications
You must be signed in to change notification settings - Fork 10.4k
Open
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