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