NSwag
NSwag copied to clipboard
NSwag 14 swagger spec includes static properties in schemas
If I have a class containing a static
property, such as
public class MyClass
{
public int PublicInstanceValue { get; set; }
public static int PublicStaticValue { get; set; }
private static int PrivateStaticValue { get; set; }
}
In swagger.json
generated by NSwag 13.20.0, the schema for MyClass
only includes PublicInstanceValue
which is the correct behaviour. In NSwag 14.0.0, the schema includes PublicInstanceValue
, PublicStaticValue
and PrivateStaticValue
unless I mark the static properties with [JsonIgnore]
like this
public class MyClass
{
public int PublicInstanceValue { get; set; }
[JsonIgnore]
public static int PublicStaticValue { get; set; }
[JsonIgnore]
private static int PrivateStaticValue { get; set; }
}
Is this a bug in NSwag 14.0.0 or is there a new option that needs to be set? I would prefer not to have to annotate all of my static properties with [JsonIgnore]
.
I faced this situation and ended up with ignoring internal
field also.
private int TestPrivate { get; set; }
private static int TestPrivateStatic { get; set; }
[JsonIgnore]
internal int TestInternal { get; set; }
internal static int TestInternalStatic { get; set; }
I see that private
instance properties are included as well in 14.0.2
.
This change can cause severe service outages.
E.g. if we have a code
public class SomeClass { public static SomeClass Instance = new SomeClass() }
If we tried to use generated code for this class, we will end up with a StackOverflow
@RicoSuter any word on this issue? I am generating TypeScript classes from a 3rd party library and all of the private fields are being included in the output. I cannot apply JsonIgnore
or similar attributes to the model. I am volunteering to investigate the root cause and create a pull request if needed - let me know.
I am using the following schema filter to ignore private properties:
private class NSwag4681Fix : ISchemaProcessor
{
public void Process(SchemaProcessorContext context)
{
foreach (ContextualPropertyInfo property in context.ContextualType.Properties)
{
if (!property.PropertyInfo.GetMethod?.IsPublic ?? false)
{
string propertyName = context.Settings.ReflectionService.GetPropertyName(property, context.Settings);
context.Schema.Properties.Remove(propertyName);
}
}
}
}
Not sure but latest NJS/NSwag version (soon released) might fix that.
I had the same issue with explicitly implemented interface properties that ended up being included in the schema. Updating from v14.0.7 to v14.0.8 fixed it. Thank you for your time! 😃
I can also confirm that the issue is resolved for static properties but it seems to persist for internal properties.