swagger-api / swagger-codegen

swagger-codegen contains a template-driven engine to generate documentation, API clients and server stubs in different languages by parsing your OpenAPI / Swagger definition.
http://swagger.io
Apache License 2.0
16.98k stars 6.03k forks source link

[Kotlin] Swagger with array of unknown item type cause NPE #8895

Open wtatum opened 5 years ago

wtatum commented 5 years ago
Description

When generating model types from a swagger.json which includes arrays of undefined item type, the plugin produces a null pointer exception:

java.lang.RuntimeException: Could not process model 'RoleContainerModel'.Please make sure that your schema is correct! at io.swagger.codegen.DefaultGenerator.generateModels(DefaultGenerator.java:370) at io.swagger.codegen.DefaultGenerator.generate(DefaultGenerator.java:743) at io.swagger.codegen.plugin.CodeGenMojo.execute(CodeGenMojo.java:534) at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:207) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80) at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51) at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128) at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307) at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193) at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106) at org.apache.maven.cli.MavenCli.execute(MavenCli.java:863) at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288) at org.apache.maven.cli.MavenCli.main(MavenCli.java:199) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289) at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415) at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356) at org.codehaus.classworlds.Launcher.main(Launcher.java:47) Caused by: java.lang.NullPointerException at io.swagger.codegen.languages.KotlinClientCodegen.toModelName(KotlinClientCodegen.java:360) at io.swagger.codegen.languages.KotlinClientCodegen.getSwaggerType(KotlinClientCodegen.java:398) at io.swagger.codegen.DefaultCodegen.getTypeDeclaration(DefaultCodegen.java:1209) at io.swagger.codegen.languages.KotlinClientCodegen.getTypeDeclaration(KotlinClientCodegen.java:420) at io.swagger.codegen.languages.KotlinClientCodegen.getTypeDeclaration(KotlinClientCodegen.java:412) at io.swagger.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:1770) at io.swagger.codegen.DefaultCodegen.addVars(DefaultCodegen.java:3108) at io.swagger.codegen.DefaultCodegen.addVars(DefaultCodegen.java:3079) at io.swagger.codegen.DefaultCodegen.addVars(DefaultCodegen.java:3065) at io.swagger.codegen.DefaultCodegen.fromModel(DefaultCodegen.java:1451) at io.swagger.codegen.DefaultGenerator.processModels(DefaultGenerator.java:1011) at io.swagger.codegen.DefaultGenerator.generateModels(DefaultGenerator.java:365) ... 25 more [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 9.032 s [INFO] Finished at: 2018-11-07T16:14:15-05:00 [INFO] Final Memory: 19M/35M [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal io.swagger:swagger-codegen-maven-plugin:2.3.1:generate (default) on project olympus-user-management: Code generation failed. See above for the full exception. -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

Swagger-codegen version

Maven plugin 2.3.1

Swagger declaration file content or url
{
  "swagger": "2.0",
  "definitions": {
     "RoleContainerModel": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "roles": {
          "type": "array",
          "uniqueItems": true
        },
        "defaultRoles": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      }
    }
  }
}

Note the JSON above is just a snip of a huge .json document, where said error occurs multiple times. I can provide the full JSON if needed, but I think this cleanly creates the issue

Command line used for generation

From POM.xml

<plugins>
            <!-- Codegen -->
            <plugin>
                <groupId>io.swagger</groupId>
                <artifactId>swagger-codegen-maven-plugin</artifactId>
                <version>2.3.1</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <configuration>
                            <inputSpec>${project.basedir}/src/main/resources/mini.json</inputSpec>
                            <language>kotlin</language>
                            <configOptions>
                                <sourceFolder>${project.basedir}/target/gen/main/kotlin</sourceFolder>
                            </configOptions>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
  <!-- SNIP -->
Steps to reproduce

mvn clean generate-sources

wtatum commented 5 years ago

I've confirmed this addresses the issue by editing the JSON to add "items": { "type": "string" } and it resolves the build-time issue, but will (probably) cause runtime issues.