NSwag icon indicating copy to clipboard operation
NSwag copied to clipboard

NSwag 14 swagger spec includes static properties in schemas

Open El-Gor-do opened this issue 1 year ago • 8 comments

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].

El-Gor-do avatar Jan 04 '24 18:01 El-Gor-do

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; }

rammba avatar Jan 10 '24 10:01 rammba

I see that private instance properties are included as well in 14.0.2.

altso avatar Jan 25 '24 21:01 altso

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

Robulane avatar Feb 29 '24 08:02 Robulane

@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.

altso avatar Apr 03 '24 15:04 altso

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);
            }
        }
    }
}

altso avatar Apr 03 '24 17:04 altso

Not sure but latest NJS/NSwag version (soon released) might fix that.

RicoSuter avatar Jun 12 '24 18:06 RicoSuter

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! 😃

Basssiiie avatar Jun 17 '24 14:06 Basssiiie

I can also confirm that the issue is resolved for static properties but it seems to persist for internal properties.

Conundraah avatar Jun 18 '24 10:06 Conundraah