RicoSuter / NSwag

The Swagger/OpenAPI toolchain for .NET, ASP.NET Core and TypeScript.
http://NSwag.org
MIT License
6.7k stars 1.24k forks source link

Error while rendering Liquid template CSharp/Client.Class #2361

Open kornakar opened 5 years ago

kornakar commented 5 years ago

NSwagStudio version v13.0.5.0 (x64). Doesn't matter if I deselect client, exception or DTO generation. Also happens when trying to generate TypeScript client.

Schema: https://dx-api-au1.thingpark.com/core/latest/tpdx-core-api-contract.json

Exception:

System.InvalidOperationException: Error while rendering Liquid template CSharp/Client.Class: 
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.NullReferenceException: Object reference not set to an instance of an object.

Runtime: NetCore22
   at NSwag.CodeGeneration.Models.OperationModelBase`2.get_UnwrappedResultType() in C:\projects\nswag\src\NSwag.CodeGeneration\Models\OperationModelBase.cs:line 120
   at NSwag.CodeGeneration.CSharp.Models.CSharpOperationModel.get_ResultType() in C:\projects\nswag\src\NSwag.CodeGeneration.CSharp\Models\CSharpOperationModel.cs:line 131
   --- End of inner exception stack trace ---
   at DotLiquid.Context.HandleError(Exception ex)
   at DotLiquid.Block.RenderAll(List`1 list, Context context, TextWriter result)
   at DotLiquid.Document.Render(Context context, TextWriter result)
   at DotLiquid.Template.RenderInternal(TextWriter result, RenderParameters parameters)
   at DotLiquid.Template.Render(TextWriter writer, RenderParameters parameters)
   at DotLiquid.Template.Render(RenderParameters parameters)
   at NJsonSchema.CodeGeneration.DefaultTemplateFactory.LiquidTemplate.Render() ---> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.NullReferenceException: Object reference not set to an instance of an object.
   at NSwag.CodeGeneration.Models.OperationModelBase`2.get_UnwrappedResultType() in C:\projects\nswag\src\NSwag.CodeGeneration\Models\OperationModelBase.cs:line 120
   at NSwag.CodeGeneration.CSharp.Models.CSharpOperationModel.get_ResultType() in C:\projects\nswag\src\NSwag.CodeGeneration.CSharp\Models\CSharpOperationModel.cs:line 131
   --- End of inner exception stack trace ---
   at DotLiquid.Context.HandleError(Exception ex)
   at DotLiquid.Block.RenderAll(List`1 list, Context context, TextWriter result)
   at DotLiquid.Document.Render(Context context, TextWriter result)
   at DotLiquid.Template.RenderInternal(TextWriter result, RenderParameters parameters)
   at DotLiquid.Template.Render(TextWriter writer, RenderParameters parameters)
   at DotLiquid.Template.Render(RenderParameters parameters)
   at NJsonSchema.CodeGeneration.DefaultTemplateFactory.LiquidTemplate.Render()
   --- End of inner exception stack trace ---
   at NJsonSchema.CodeGeneration.DefaultTemplateFactory.LiquidTemplate.Render()
   at NSwag.CodeGeneration.CSharp.CSharpClientGenerator.GenerateClientTypes(String controllerName, String controllerClassName, IEnumerable`1 operations)+MoveNext()
   at System.Collections.Generic.List`1.AddEnumerable(IEnumerable`1 enumerable)
   at System.Collections.Generic.List`1.InsertRange(Int32 index, IEnumerable`1 collection)
   at NSwag.CodeGeneration.ClientGeneratorBase`3.GenerateAllClientTypes() in C:\projects\nswag\src\NSwag.CodeGeneration\ClientGeneratorBase.cs:line 112
   at NSwag.CodeGeneration.ClientGeneratorBase`3.GenerateFile(ClientGeneratorOutputType outputType) in C:\projects\nswag\src\NSwag.CodeGeneration\ClientGeneratorBase.cs:line 73
   at NSwag.Commands.CodeGeneration.SwaggerToCSharpClientCommand.<RunAsync>b__83_0() in C:\projects\nswag\src\NSwag.Commands\Commands\CodeGeneration\OpenApiToCSharpClientCommand.cs:line 242
   at NSwag.Commands.CodeGeneration.SwaggerToCSharpClientCommand.RunAsync() in C:\projects\nswag\src\NSwag.Commands\Commands\CodeGeneration\OpenApiToCSharpClientCommand.cs:line 228
   at NSwag.Commands.CodeGeneration.SwaggerToCSharpClientCommand.RunAsync(CommandLineProcessor processor, IConsoleHost host) in C:\projects\nswag\src\NSwag.Commands\Commands\CodeGeneration\OpenApiToCSharpClientCommand.cs:line 217
   at NSwag.Commands.NSwagDocument.ExecuteAsync() in C:\projects\nswag\src\NSwag.Commands\NSwagDocument.cs:line 85
   at NSwag.Commands.Document.ExecuteDocumentCommand.ExecuteDocumentAsync(IConsoleHost host, String filePath) in C:\projects\nswag\src\NSwag.Commands\Commands\Document\ExecuteDocumentCommand.cs:line 85
   at NSwag.Commands.Document.ExecuteDocumentCommand.RunAsync(CommandLineProcessor processor, IConsoleHost host) in C:\projects\nswag\src\NSwag.Commands\Commands\Document\ExecuteDocumentCommand.cs:line 32
   at NConsole.CommandLineProcessor.ProcessSingleAsync(String[] args, Object input)
   at NConsole.CommandLineProcessor.ProcessAsync(String[] args, Object input)
   at NConsole.CommandLineProcessor.Process(String[] args, Object input)
   at NSwag.Commands.NSwagCommandProcessor.Process(String[] args) in C:\projects\nswag\src\NSwag.Commands\NSwagCommandProcessor.cs:line 56
kornakar commented 5 years ago

response.Value.Schema is null in the OperationModelBase.UnwrappedResultType getter.

What should be returned in this case? If I return "void" or string.Empty then it generates a return statement like this:

return default(void); or return default();

instead of

return;

RicoSuter commented 5 years ago

I think in this case HasResultType (or similar) should return false so that UnwrappedResultType is never called

Hipster74 commented 5 years ago

Same problem here, trying to generate the client classes from openAPIschema json but it fails.

Retreiving json schema from url like this(testing with same url as @kornakar ): var document = await OpenApiDocument.FromUrlAsync(Url);

Packagereferences(testing with .NET Core 2.2 console application): <PackageReference Include="Newtonsoft.Json" Version="12.0.2" /> <PackageReference Include="NSwag.CodeGeneration.CSharp" Version="13.0.6" /> <PackageReference Include="System.ComponentModel.Annotations" Version="4.5.0" /> <PackageReference Include="System.Net.Http" Version="4.3.4" />

Error: Unhandled Exception: System.InvalidOperationException: Error while rendering Liquid template CSharp/Client.Class: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.NullReferenceException: Object reference not set to an instance of an object.

ryanbrandenburg commented 4 years ago

@RicoSuter we've run into this with the OpenAPI integration for AspNetCore. Repro steps for that:

  1. dotnet new razor // Create a project to work on.
  2. dotnet tool install --global Microsoft.dotnet-openapi //Install the tool.
  3. Close and open the Powershel window to allow the tool to get on the path.
  4. dotnet openapi add url https://raw.githubusercontent.com/OAI/OpenAPI-Specification/master/examples/v2.0/json/api-with-examples.json //Add an openapi reference
  5. dotnet build // This fails with the following stacktrace
    System.InvalidOperationException: Error while rendering Liquid template CSharp/Client.Class:
    System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
    ---> System.NullReferenceException: Object reference not set to an instance of an object.
     at NSwag.CodeGeneration.Models.OperationModelBase`2.get_UnwrappedResultType() in C:\projects\nswag\src\NSwag.CodeGeneration\Models\OperationModelBase.cs:line 120
     at NSwag.CodeGeneration.CSharp.Models.CSharpOperationModel.get_SyncResultType() in C:\projects\nswag\src\NSwag.CodeGeneration.CSharp\Models\CSharpOperationModel.cs:line 122
     at NSwag.CodeGeneration.CSharp.Models.CSharpOperationModel.get_ResultType() in C:\projects\nswag\src\NSwag.CodeGeneration.CSharp\Models\CSharpOperationModel.cs:line 131
     --- End of inner exception stack trace ---
     at DotLiquid.Context.HandleError(Exception ex)
     at DotLiquid.Block.RenderAll(List`1 list, Context context, TextWriter result)
     at DotLiquid.Block.Render(Context context, TextWriter result)
     at DotLiquid.Document.Render(Context context, TextWriter result)
     at DotLiquid.Template.RenderInternal(TextWriter result, RenderParameters parameters)
     at DotLiquid.Template.Render(TextWriter writer, RenderParameters parameters)
     at DotLiquid.Template.Render(RenderParameters parameters)
     at NJsonSchema.CodeGeneration.DefaultTemplateFactory.LiquidTemplate.Render()
    ---> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
    ---> System.NullReferenceException: Object reference not set to an instance of an object.
     at NSwag.CodeGeneration.Models.OperationModelBase`2.get_UnwrappedResultType() in C:\projects\nswag\src\NSwag.CodeGeneration\Models\OperationModelBase.cs:line 120
     at NSwag.CodeGeneration.CSharp.Models.CSharpOperationModel.get_SyncResultType() in C:\projects\nswag\src\NSwag.CodeGeneration.CSharp\Models\CSharpOperationModel.cs:line 122
     at NSwag.CodeGeneration.CSharp.Models.CSharpOperationModel.get_ResultType() in C:\projects\nswag\src\NSwag.CodeGeneration.CSharp\Models\CSharpOperationModel.cs:line 131
     --- End of inner exception stack trace ---
     at DotLiquid.Context.HandleError(Exception ex)
     at DotLiquid.Block.RenderAll(List`1 list, Context context, TextWriter result)
     at DotLiquid.Block.Render(Context context, TextWriter result)
     at DotLiquid.Document.Render(Context context, TextWriter result)
     at DotLiquid.Template.RenderInternal(TextWriter result, RenderParameters parameters)
     at DotLiquid.Template.Render(TextWriter writer, RenderParameters parameters)
     at DotLiquid.Template.Render(RenderParameters parameters)
     at NJsonSchema.CodeGeneration.DefaultTemplateFactory.LiquidTemplate.Render()
     --- End of inner exception stack trace ---
     at NJsonSchema.CodeGeneration.DefaultTemplateFactory.LiquidTemplate.Render()
     at NJsonSchema.CodeGeneration.CodeArtifact..ctor(String typeName, CodeArtifactType type, CodeArtifactLanguage language, CodeArtifactCategory category, ITemplate template)
     at NSwag.CodeGeneration.CSharp.CSharpClientGenerator.GenerateClientTypes(String controllerName, String controllerClassName, IEnumerable`1 operations)+MoveNext() in C:\projects\nswag\src\NSwag.CodeGeneration.CSharp\CSharpClientGenerator.cs:line 68
     at System.Collections.Generic.List`1.InsertRange(Int32 index, IEnumerable`1 collection)
     at NSwag.CodeGeneration.ClientGeneratorBase`3.GenerateAllClientTypes() in C:\projects\nswag\src\NSwag.CodeGeneration\ClientGeneratorBase.cs:line 112
     at NSwag.CodeGeneration.ClientGeneratorBase`3.GenerateFile(ClientGeneratorOutputType outputType) in C:\projects\nswag\src\NSwag.CodeGeneration\ClientGeneratorBase.cs:line 73
     at NSwag.Commands.CodeGeneration.SwaggerToCSharpClientCommand.<RunAsync>b__83_0() in C:\projects\nswag\src\NSwag.Commands\Commands\CodeGeneration\OpenApiToCSharpClientCommand.cs:line 242
     at NSwag.Commands.CodeGeneration.SwaggerToCSharpClientCommand.RunAsync() in C:\projects\nswag\src\NSwag.Commands\Commands\CodeGeneration\OpenApiToCSharpClientCommand.cs:line 228
     at NSwag.Commands.CodeGeneration.SwaggerToCSharpClientCommand.RunAsync(CommandLineProcessor processor, IConsoleHost host) in C:\projects\nswag\src\NSwag.Commands\Commands\CodeGeneration\OpenApiToCSharpClientCommand.cs:line 217
     at NConsole.CommandLineProcessor.ProcessSingleAsync(String[] args, Object input)
     at NConsole.CommandLineProcessor.ProcessAsync(String[] args, Object input)
     at NConsole.CommandLineProcessor.Process(String[] args, Object input)
     at NSwag.Commands.NSwagCommandProcessor.Process(String[] args) in C:\projects\nswag\src\NSwag.Commands\NSwagCommandProcessor.cs:line 56
    C:\Users\WDAGUtilityAccount\.nuget\packages\nswag.apidescription.client\13.0.5\build\NSwag.ApiDescription.Client.targets(28,5): error MSB3073: The command "dotnet --roll-forward-on-no-candidate-fx 2 C:\Users\WDAGUtilityAccount\.nuget\packages\nswag.msbuild\13.0.5\build\../tools/NetCore21//dotnet-nswag.dll openapi2csclient /className:api_with_examplesClient /namespace:razor /input:C:\Users\WDAGUtilityAccount\projects\razor\api-with-examples.json /output:obj\api-with-examplesClient.cs " exited with code -1

    I noticed that we're still on 13.0.5, this wouldn't happen to be fixed in a later version would it?