简体   繁体   English

使用 swagger codegen for openapi 3.0 生成代码时出现 NullPointer 异常

[英]NullPointer exception while generating code using swagger codegen for openapi 3.0

Facing issue of NullPointer while generating code through swagger codegen.通过 swagger codegen 生成代码时遇到 NullPointer 问题。 I am new to gradle and have updated build.gradle to reflect latest changes required to generate the code for the given API spec.我是 gradle 的新手,并更新了 build.gradle 以反映为给定 API 规范生成代码所需的最新更改。

Please provide your valuable inputs.请提供您的宝贵意见。

My build.gradle is as shown below:我的 build.gradle 如下图所示:

import io.swagger.codegen.v3.CodegenConfigLoader
import io.swagger.codegen.v3.DefaultGenerator
import io.swagger.codegen.v3.ClientOptInput
import io.swagger.codegen.v3.ClientOpts
import io.swagger.v3.parser.OpenAPIV3Parser

buildscript {
    ext {
        springBootVersion = '2.0.5.RELEASE'
        jacocoWorkspaceDirectory = "/jacoco/"
    }
    repositories {
        mavenLocal()
        maven { url "http://repo.maven.apache.org/maven2" }
    }
    dependencies {
        classpath "org.springframework.boot:spring-boot-gradle-plugin:$springBootVersion"
        classpath group: "io.spring.gradle", name: "dependency-management-plugin", version: "1.0.6.RELEASE"
        classpath 'co.bambo.sonar:bambo-sonar-gradle-plugin:2.7.1.RELEASE'
        classpath group: "org.unbroken-dome.gradle-plugins", name: "gradle-testsets-plugin", version: "1.4.2"
        classpath('io.swagger.codegen.v3:swagger-codegen-maven-plugin:3.0.16')
        classpath("io.swagger.core.v3:swagger-core:2.1.1")
    }
}

apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'maven-publish'
apply plugin: "io.spring.dependency-management"
apply plugin: "org.springframework.boot"
apply plugin: 'bambo-sonar'
apply plugin: "jacoco"
apply plugin: "findbugs"
apply plugin: "checkstyle"
apply plugin: "pmd"
apply plugin: 'org.unbroken-dome.test-sets'


project.buildDir = 'target'

ext {
    appName = 'school-management'
    apiPackage = 'co.bambo.school.management.generated.api'
    modelPackage = 'co.bambo.school.management.generated.model'
    swaggerFile = "${rootDir}/src/main/resources/schoolmanagement.v1.yaml"
    swaggerBuildDir = "${project.buildDir}/" + appName
}


// NOTE :-> Following are to be included as and when required.
// These variables are defined for the purpose of exclusion from the sonar scan. Packages mentioned will be exluded
// from Sonar Scans.
def excludeschoolmanagementConstants = "src/main/java/co/bambo/school/management/constants/schoolmanagementConstants.java"
def excludeCaasConstants = "src/main/java/co/bambo/school/management/pcf/constants/CaasConstants.java"

sourceCompatibility = 1.8
targetCompatibility = 1.8

group = 'co.bambo.schoolmanagement'
version = '1.0.0-SNAPSHOT'

tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}

repositories {
    mavenLocal()
    maven { url "http://repo.maven.apache.org/maven2" }
}

configurations {
    testUtilCompile.extendsFrom testImplementation
    testUtilRuntime.extendsFrom testRuntime
}

sourceSets {
    testUtil {
        java {
            srcDir 'src/test-util/java'
        }
    }
}

testSets {
    funcTest { dirName = "func-test" }
}


// PLUGIN CONFIGs
springBoot {
    mainClassName = 'co.bambo.school.management.schoolmanagementApplication'
    buildInfo()
}

bootJar {
    baseName = 'school-management'
    destinationDir = project.buildDir
    archiveName = 'school-management.jar'
}

// FIXME - IN FUTURE WE NEED TO MAKE THIS to Zero.
checkstyle {
    maxErrors = 70
    maxWarnings = 70
    toolVersion = 8.17
}

[checkstyleMain, checkstyleTest].each { task ->
    task.logging.setLevel(LogLevel.LIFECYCLE)
    // FIXME -  This is to be updated with False.
    task.ignoreFailures = true
}

findbugs {
    toolVersion = "3.0.1"
    sourceSets = [sourceSets.main]
    // FIXME - Make this false.
    ignoreFailures = true
    effort = "max"
    reportLevel = "medium"
    excludeFilter = file("$rootDir/config/findbugs/exclude.xml")
}

pmd {
    toolVersion = "5.6.1"
    ignoreFailures = true
    sourceSets = [sourceSets.main]
    reportsDir = file("${project.buildDir}/reports/pmdTest")
    ruleSets = [
            'java-basic'
    ]
}

tasks.withType(FindBugs) {
    reports {
        xml.enabled = false
        html.enabled = true
    }
}

tasks.withType(Pmd) {
    reports {
        xml.enabled = false
        html.enabled = true
    }
}


sonarqube {
    properties {
        property "sonar.projectName", "school-management"
        property "sonar.projectKey", "school-management"
        property "sonar.jacoco.reportPath", "build/jacoco/test.exec"
        property "sonar.junit.reportPaths", "build/test-results/test"
        property "sonar.host.url", "https://fusion.bambo.int/sonar"
        property "sonar.gateId", "307"
        property "sonar.projectDescription", "school management microservice."
        property "sonar.skip.qualityGate", "false"
        property "sonar.exclusions", [excludeschoolmanagementConstants, excludeCaasConstants]
    }
}

// Actual task for generating the server
task generateServer {
    doLast {
        def openAPI = new OpenAPIV3Parser().read(rootProject.swaggerFile.toString(), null, null)
        def clientOptInput = new ClientOptInput().openAPI(openAPI)
        def codeGenConfig = CodegenConfigLoader.forName('spring')
        codeGenConfig.setApiPackage(rootProject.ext.apiPackage)            // Package to be used for the API interfaces
        codeGenConfig.setModelPackage(rootProject.ext.modelPackage)        // Package to be used for the API models
        codeGenConfig.setInputSpec(rootProject.ext.swaggerFile.toString()) // The swagger API file
        codeGenConfig.setOutputDir(rootProject.ext.swaggerBuildDir)
        // The output directory, user-service-contract/build/user-service-server/
//        codegenConfig.addSystemProperty("models", "");
//        codegenConfig.addSystemProperty("apis", "");

        def clientOps = new ClientOpts()
        clientOps.setProperties([
                'dateLibrary'  : 'java8', // Date library to use
                'useTags'      : 'true',  // Use tags for the naming
                'interfaceOnly': 'false'// Generating the Controller API interface and the models only
        ])
        clientOptInput.setOpts(clientOps)
        def generator = new DefaultGenerator().opts(clientOptInput)
        generator.generate() // Executing the generation
    }
}

compileJava {
    dependsOn generateServer
}

build {
    dependsOn generateServer
}

// ---- PLUGIN CONFIG ENDs


dependencyManagement {
    imports {
        mavenBom "org.springframework.boot:spring-boot-dependencies:$springBootVersion"
    }
}

funcTest {
    doFirst {
        jacoco {
            destinationFile = file("${buildDir}" + jacocoWorkspaceDirectory + "test.exec")
        }
    }

    dependsOn cleanTest
    dependsOn compileTestUtilJava
    dependsOn cleanJacocoTestReport
    dependsOn cleanJacocoTestCoverageVerification
    finalizedBy jacocoTestReport
    finalizedBy jacocoTestCoverageVerification
    environment SPRING_PROFILES_ACTIVE: environment.SPRING_PROFILES_ACTIVE ?: "local"
}

dependencies {
    // Spring specific dependencies
    implementation('org.springframework:spring-tx')
    implementation('org.springframework:spring-core')
    implementation('org.springframework:spring-context')
    implementation('org.springframework:spring-beans')
    implementation('org.springframework:spring-expression')
    implementation group: 'org.springframework.boot', name: 'spring-boot-starter-actuator'
    implementation group: 'org.springframework.boot', name: 'spring-boot-starter-aop'
    implementation group: 'org.springframework.retry', name: 'spring-retry'

    implementation group: 'org.springframework.boot', name: "spring-boot-starter-data-jpa"

    // Spring cloud
    // Upgraded springcloud-starter-vault from 2.0.0.RC1 to 2.0.1.RELEASE.
    implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-vault-config', version: '2.0.1.RELEASE'
    implementation group: 'io.pivotal.spring.cloud', name: 'spring-cloud-services-starter-config-client', version: '2.0.1.RELEASE'
    // Upgraded "spring-cloud-starter-bus-amqp" following from 2.0.0.RC1 to 2.0.1.RELEASE
    implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-bus-amqp', version: '2.0.1.RELEASE'

    // SWagger dependencies
    implementation group: 'io.swagger', name: 'swagger-parser', version: '1.0.23'
    implementation group: 'io.springfox', name: 'springfox-swagger2', version: '2.9.2'
    implementation group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.9.2'
    implementation group: 'com.atlassian.oai', name: 'swagger-request-validator-core', version: '1.3.9'

    // Apache - Commons
    implementation group: 'commons-io', name: 'commons-io', version: '2.6'

    // Oracle dependencies
    implementation group: 'com.oracle', name: 'ojdbc7', version: '12.1.0'

    //2nd level cache dependency
    implementation group: 'org.hibernate', name: 'hibernate-ehcache'

    // Logback
    implementation group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3'
    implementation group: 'ch.qos.logback', name: 'logback-core', version: '1.2.3'

    implementation group: 'org.apache.camel', name: 'camel-jsonpath', version: '2.22.0'
    implementation group: 'com.google.gdata', name: 'core', version: '1.47.1'
    implementation group: 'com.google.guava', name: 'guava', version: '20.0'

    // FIXME - Eventually phase - out this Mapper
    implementation group: 'ma.glasnost.orika', name: 'orika-core', version: '1.5.4'

    // JSON
    implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-xml', version: '2.8.10'
    implementation group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1.1'

    // Mapstruct
    implementation 'org.mapstruct:mapstruct:1.3.0.Final'
    implementation 'org.mapstruct:mapstruct-processor:1.3.0.Final'

    implementation group: 'ch.qos.logback.contrib', name: 'logback-json-classic', version: '0.1.5'
    implementation group: 'ch.qos.logback.contrib', name: 'logback-jackson', version: '0.1.5'

    testImplementation "junit:junit:4.12"
    testImplementation group: "org.springframework.boot", name: "spring-boot-starter-test"
    testImplementation group: 'com.github.tomakehurst', name: 'wiremock', version: '2.21.0'

    testUtilCompile sourceSets.main.output
    funcTestCompile sourceSets.testUtil.output
}

I am facing issue of NullPointer on this line def generator = new DefaultGenerator().opts(clientOptInput) .我在这一行遇到NullPointer问题def generator = new DefaultGenerator().opts(clientOptInput)

Update-1 I understand the question seems fairly easy for NullPointer exception in java. Update-1我理解这个问题对于 Java 中的 NullPointer 异常来说似乎很容易。 but trust me, I am not able to figure out in build.gradle why it is failing as it is not even showing proper error message that what is missing.但是相信我,我无法在 build.gradle 中弄清楚为什么它会失败,因为它甚至没有显示正确的错误消息,说明缺少什么。 Below shown message is all I am getting.下面显示的消息是我所得到的。 Even the debugging of groovy script isn't helping me.即使调试 groovy 脚本也无济于事。

Execution failed for task ':generateServer'.
> java.lang.NullPointerException (no error message)

Update-2 I just got to see in the DefaultGenerator.java on line number 77, found this line. Update-2我刚刚在 DefaultGenerator.java 的第 77 行看到了这一行。 This is where I am getting NullPointerException this.config.additionalProperties().putAll(opts.getOpts().getProperties());这是我得到 NullPointerException this.config.additionalProperties().putAll(opts.getOpts().getProperties());

I am not sure what is missing in parameters.我不确定参数中缺少什么。 I am passing opts and getOpts() is also populating properties file.我正在传递opts并且getOpts()也在填充属性文件。

Using gradle version 4.9.使用 gradle 4.9 版。

Okay I figured it out, it was a silly mistake in understanding and in code as well.好吧,我想通了,这在理解和代码中也是一个愚蠢的错误。

I got to know this mistake just after debugging and browsing through the swagger-codegen code.在调试和浏览swagger-codegen代码后,我才知道这个错误。 I realized that the config is required to generate code, based on this config specified it is generating code.我意识到生成代码需要配置,基于此配置指定它正在生成代码。 I was generating the spring based CodeGenConfiguration but I was not passing it into the clientOptInput.我正在生成基于spring的 CodeGenConfiguration,但我没有将它传递到 clientOptInput。 My understanding was wrong, I assumed it will load the class for CodeGenConfig (Which it does load) and that's it.我的理解是错误的,我认为它会加载 CodeGenConfig 的类(它确实加载了它),就是这样。 however you also need to pass it to the clientOptInput variable.但是,您还需要将其传递给clientOptInput变量。

def codeGenConfig = CodegenConfigLoader.forName('spring')
clientOptInput.setConfig(codeGenConfig)

Since, the code for DefaultGenerator.java as per below:因为, DefaultGenerator.java的代码如下:

    @Override
    public Generator opts(ClientOptInput opts) {
        this.opts = opts;
        this.openAPI = opts.getOpenAPI();
        this.config = opts.getConfig();

I need to set it to the ClientOptInput instance.我需要将它设置为ClientOptInput实例。 This is the reason.这就是原因。 Posting for others like me who makes mistakes :) :)为像我这样犯错的人发帖:) :)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在 Gradle for OpenAPI 3.0 中使用 Swagger Codegen? - How to use Swagger Codegen in Gradle for OpenAPI 3.0? 使用 swagger-codegen maven 插件生成代码时删除默认实现 - remove default implementation while generating code using swagger-codegen maven plugin 如何使用 springdoc-openapi-maven-plugin 和 swagger-codegen-maven-plugin 生成客户端代码? - How to generate client code using springdoc-openapi-maven-plugin and swagger-codegen-maven-plugin? OpenAPI Generator/Swagger Codegen 中的嵌套属性 inheritance - Nested property inheritance in OpenAPI Generator/Swagger Codegen 如何使用 swagger-codegen-plugin (maven) 生成客户端代码? - How to generate client code using with swagger-codegen-plugin (maven)? 使用swagger codegen插件通过几个yaml文件生成代码 - generate code via several yaml file using swagger codegen plugin 使用MyBatis连接到数据库时出现Nullpointer异常 - Nullpointer exception while connecting to DB using MyBatis 使用Spring Data ElasticSearch时出现Nullpointer异常 - Nullpointer Exception while using Spring Data ElasticSearch 在Spring中使用多线程时出现NullPointer异常 - NullPointer exception while using Multithread in Spring Swagger Codegen在为具有OAuth2.0安全性的Rest API生成Java客户端时无法正常工作 - Swagger Codegen is not working while generating java client for a Rest API having OAuth2.0 security
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM