@@ -155,6 +155,7 @@ internal async Task ApplySchemaTransformersAsync(OpenApiSchema schema, Type type
155
155
} ;
156
156
for ( var i = 0 ; i < _openApiOptions . SchemaTransformers . Count ; i ++ )
157
157
{
158
+ // Reset context object to base state before running each transformer.
158
159
var transformer = _openApiOptions . SchemaTransformers [ i ] ;
159
160
// If the transformer is a type-based transformer, we need to initialize and finalize it
160
161
// once in the context of the top-level assembly and not the child properties we are invoking
@@ -164,7 +165,7 @@ internal async Task ApplySchemaTransformersAsync(OpenApiSchema schema, Type type
164
165
var initializedTransformer = typeBasedTransformer . InitializeTransformer ( serviceProvider ) ;
165
166
try
166
167
{
167
- await InnerApplySchemaTransformersAsync ( schema , jsonTypeInfo , context , initializedTransformer , cancellationToken ) ;
168
+ await InnerApplySchemaTransformersAsync ( schema , jsonTypeInfo , null , context , initializedTransformer , cancellationToken ) ;
168
169
}
169
170
finally
170
171
{
@@ -173,17 +174,19 @@ internal async Task ApplySchemaTransformersAsync(OpenApiSchema schema, Type type
173
174
}
174
175
else
175
176
{
176
- await InnerApplySchemaTransformersAsync ( schema , jsonTypeInfo , context , transformer , cancellationToken ) ;
177
+ await InnerApplySchemaTransformersAsync ( schema , jsonTypeInfo , null , context , transformer , cancellationToken ) ;
177
178
}
178
179
}
179
180
}
180
181
181
182
private async Task InnerApplySchemaTransformersAsync ( OpenApiSchema schema ,
182
183
JsonTypeInfo jsonTypeInfo ,
184
+ JsonPropertyInfo ? jsonPropertyInfo ,
183
185
OpenApiSchemaTransformerContext context ,
184
186
IOpenApiSchemaTransformer transformer ,
185
187
CancellationToken cancellationToken = default )
186
188
{
189
+ context . UpdateJsonTypeInfo ( jsonTypeInfo , jsonPropertyInfo ) ;
187
190
await transformer . TransformAsync ( schema , context , cancellationToken ) ;
188
191
189
192
// Only apply transformers on polymorphic schemas where we can resolve the derived
@@ -194,31 +197,28 @@ private async Task InnerApplySchemaTransformersAsync(OpenApiSchema schema,
194
197
foreach ( var derivedType in jsonTypeInfo . PolymorphismOptions . DerivedTypes )
195
198
{
196
199
var derivedJsonTypeInfo = _jsonSerializerOptions . GetTypeInfo ( derivedType . DerivedType ) ;
197
- context . UpdateJsonTypeInfo ( derivedJsonTypeInfo , null ) ;
198
200
if ( schema . AnyOf . Count <= anyOfIndex )
199
201
{
200
202
break ;
201
203
}
202
- await InnerApplySchemaTransformersAsync ( schema . AnyOf [ anyOfIndex ] , derivedJsonTypeInfo , context , transformer , cancellationToken ) ;
204
+ await InnerApplySchemaTransformersAsync ( schema . AnyOf [ anyOfIndex ] , derivedJsonTypeInfo , null , context , transformer , cancellationToken ) ;
203
205
anyOfIndex ++ ;
204
206
}
205
207
}
206
208
207
209
if ( schema . Items is not null )
208
210
{
209
211
var elementTypeInfo = _jsonSerializerOptions . GetTypeInfo ( jsonTypeInfo . ElementType ! ) ;
210
- context . UpdateJsonTypeInfo ( elementTypeInfo , null ) ;
211
- await InnerApplySchemaTransformersAsync ( schema . Items , elementTypeInfo , context , transformer , cancellationToken ) ;
212
+ await InnerApplySchemaTransformersAsync ( schema . Items , elementTypeInfo , null , context , transformer , cancellationToken ) ;
212
213
}
213
214
214
215
if ( schema . Properties is { Count : > 0 } )
215
216
{
216
217
foreach ( var propertyInfo in jsonTypeInfo . Properties )
217
218
{
218
- context . UpdateJsonTypeInfo ( _jsonSerializerOptions . GetTypeInfo ( propertyInfo . PropertyType ) , propertyInfo ) ;
219
219
if ( schema . Properties . TryGetValue ( propertyInfo . Name , out var propertySchema ) )
220
220
{
221
- await InnerApplySchemaTransformersAsync ( propertySchema , _jsonSerializerOptions . GetTypeInfo ( propertyInfo . PropertyType ) , context , transformer , cancellationToken ) ;
221
+ await InnerApplySchemaTransformersAsync ( propertySchema , _jsonSerializerOptions . GetTypeInfo ( propertyInfo . PropertyType ) , propertyInfo , context , transformer , cancellationToken ) ;
222
222
}
223
223
}
224
224
}
0 commit comments