无法实例化提供程序 io.swagger.scala.converter.SwaggerScalaModelConverter
Provider io.swagger.scala.converter.SwaggerScalaModelConverter could not be instantiated
当我试图将 swagger 融入我的 API 时,我 运行 遇到了一些问题。
我的 API 使用的是 Jersey 2.22,语言是 Scala。我已将以下依赖项添加到我的 pom:
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>1.5.12</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-scala-module_2.11</artifactId>
<version>1.0.3</version>
</dependency>
我的插件配置如下:
<plugin>
<groupId>com.github.kongchen</groupId>
<artifactId>swagger-maven-plugin</artifactId>
<version>${kongchen.plugin.version}</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<apiSources>
<apiSource>
<locations>${swagger.locations}</locations>
<springmvc>false</springmvc>
<host>${swagger.host}</host>
<basePath>${base.path}</basePath>
<info>
<title>${swagger.title}</title>
<version>${project.version}</version>
<description>${swagger.description}</description>
</info>
<swaggerDirectory>${project.build.directory}/</swaggerDirectory>
<outputFormats>yaml,json</outputFormats>
</apiSource>
</apiSources>
</configuration>
</plugin>
我在运行 mvn compile 时出现如下错误:
Exception in thread "main" java.util.ServiceConfigurationError: io.swagger.converter.ModelConverter: Provider io.swagger.scala.converter.SwaggerScalaModelConverter could not be instantiated
at java.util.ServiceLoader.fail(ServiceLoader.java:232)
at java.util.ServiceLoader.access0(ServiceLoader.java:185)
at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:384)
at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
at java.util.ServiceLoader.next(ServiceLoader.java:480)
at io.swagger.converter.ModelConverters.<clinit>(ModelConverters.java:114)
at com.github.kongchen.swagger.docgen.AbstractDocumentSource.loadModelModifier(AbstractDocumentSource.java:179)
at com.github.kongchen.swagger.docgen.mavenplugin.ApiDocumentMojo.execute(ApiDocumentMojo.java:71)
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 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
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)
Caused by: java.lang.VerifyError: Cannot inherit from final class
如果我省略了 scala-swagger 模块,编译工作正常,我得到一个有效的 json(所有资源描述都完美生成),但是 scala 案例中的字段 类 不生成:
@ApiModel("some model")
case class HelloModel(@(ApiModelProperty @field)(dataType = "Int", value = "some int", name = "tries") tries: Int)
结果:
"definitions" : {
"some model" : {
"type" : "object"
}
}
有人知道吗?
好吧,经过一些繁重的调试后我弄明白了。看来我使用的 swagger-maven-plugin (3.1.1) 使用的是 swagger-core 1.5.4。这个 swagger-core 依赖项依赖于 Jackson 2.4.5。
swagger-scala-module_2.11 使用 Jackson 2.8.7。 "Cannot inherit from final class" 错误来自 TypeReference class,显然 changed/got 在 2.8.7 中引入。
解决方案是使用依赖块将 swagger-scala-module_2.11 包含在 swagger-maven-plugin 中:
<build>
<plugins>
<plugin>
<groupId>com.github.kongchen</groupId>
<artifactId>swagger-maven-plugin</artifactId>
<version>${swagger-scala-maven-plugin}</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-scala-module_2.11</artifactId>
<version>1.0.3</version>
</dependency>
</dependencies>
<configuration>
<apiSources>
<apiSource>
<locations>
<location>${swagger.locations}</location>
</locations>
<springmvc>false</springmvc>
<host>${swagger.host}</host>
<basePath>${base.path}</basePath>
<info>
<title>${swagger.title}</title>
<version>${project.version}</version>
<description>${swagger.description}</description>
</info>
<swaggerDirectory>${project.build.directory}/</swaggerDirectory>
<outputFormats>json</outputFormats>
</apiSource>
</apiSources>
</configuration>
</plugin>
</plugins>
</build>
这将使 swagger-maven-plugin 使用 swagger core 1.5.12 而不是提供的 1.5.9。
我在 Play Framework 2.4.6 项目中使用 SBT 时遇到了同样的问题。 GieJay 提供的答案在我的案例中也被证明是正确的,我只是想指出我在 SBT 环境中的解决方案;在我的 libraryDependencies
我有
"io.swagger" %% "swagger-play2" % "1.5.1"
在另一个使用 Play 2.4.8 的项目中工作正常,但我在较旧的 Play 版本中遇到了这个问题。
我所要做的就是添加
"io.swagger" % "swagger-scala-module_2.11" % "1.0.3"
对于依赖项和所有工作都很有魅力。
当我试图将 swagger 融入我的 API 时,我 运行 遇到了一些问题。
我的 API 使用的是 Jersey 2.22,语言是 Scala。我已将以下依赖项添加到我的 pom:
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>1.5.12</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-scala-module_2.11</artifactId>
<version>1.0.3</version>
</dependency>
我的插件配置如下:
<plugin>
<groupId>com.github.kongchen</groupId>
<artifactId>swagger-maven-plugin</artifactId>
<version>${kongchen.plugin.version}</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<apiSources>
<apiSource>
<locations>${swagger.locations}</locations>
<springmvc>false</springmvc>
<host>${swagger.host}</host>
<basePath>${base.path}</basePath>
<info>
<title>${swagger.title}</title>
<version>${project.version}</version>
<description>${swagger.description}</description>
</info>
<swaggerDirectory>${project.build.directory}/</swaggerDirectory>
<outputFormats>yaml,json</outputFormats>
</apiSource>
</apiSources>
</configuration>
</plugin>
我在运行 mvn compile 时出现如下错误:
Exception in thread "main" java.util.ServiceConfigurationError: io.swagger.converter.ModelConverter: Provider io.swagger.scala.converter.SwaggerScalaModelConverter could not be instantiated
at java.util.ServiceLoader.fail(ServiceLoader.java:232)
at java.util.ServiceLoader.access0(ServiceLoader.java:185)
at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:384)
at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
at java.util.ServiceLoader.next(ServiceLoader.java:480)
at io.swagger.converter.ModelConverters.<clinit>(ModelConverters.java:114)
at com.github.kongchen.swagger.docgen.AbstractDocumentSource.loadModelModifier(AbstractDocumentSource.java:179)
at com.github.kongchen.swagger.docgen.mavenplugin.ApiDocumentMojo.execute(ApiDocumentMojo.java:71)
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 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
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)
Caused by: java.lang.VerifyError: Cannot inherit from final class
如果我省略了 scala-swagger 模块,编译工作正常,我得到一个有效的 json(所有资源描述都完美生成),但是 scala 案例中的字段 类 不生成:
@ApiModel("some model")
case class HelloModel(@(ApiModelProperty @field)(dataType = "Int", value = "some int", name = "tries") tries: Int)
结果:
"definitions" : {
"some model" : {
"type" : "object"
}
}
有人知道吗?
好吧,经过一些繁重的调试后我弄明白了。看来我使用的 swagger-maven-plugin (3.1.1) 使用的是 swagger-core 1.5.4。这个 swagger-core 依赖项依赖于 Jackson 2.4.5。
swagger-scala-module_2.11 使用 Jackson 2.8.7。 "Cannot inherit from final class" 错误来自 TypeReference class,显然 changed/got 在 2.8.7 中引入。
解决方案是使用依赖块将 swagger-scala-module_2.11 包含在 swagger-maven-plugin 中:
<build>
<plugins>
<plugin>
<groupId>com.github.kongchen</groupId>
<artifactId>swagger-maven-plugin</artifactId>
<version>${swagger-scala-maven-plugin}</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-scala-module_2.11</artifactId>
<version>1.0.3</version>
</dependency>
</dependencies>
<configuration>
<apiSources>
<apiSource>
<locations>
<location>${swagger.locations}</location>
</locations>
<springmvc>false</springmvc>
<host>${swagger.host}</host>
<basePath>${base.path}</basePath>
<info>
<title>${swagger.title}</title>
<version>${project.version}</version>
<description>${swagger.description}</description>
</info>
<swaggerDirectory>${project.build.directory}/</swaggerDirectory>
<outputFormats>json</outputFormats>
</apiSource>
</apiSources>
</configuration>
</plugin>
</plugins>
</build>
这将使 swagger-maven-plugin 使用 swagger core 1.5.12 而不是提供的 1.5.9。
我在 Play Framework 2.4.6 项目中使用 SBT 时遇到了同样的问题。 GieJay 提供的答案在我的案例中也被证明是正确的,我只是想指出我在 SBT 环境中的解决方案;在我的 libraryDependencies
我有
"io.swagger" %% "swagger-play2" % "1.5.1"
在另一个使用 Play 2.4.8 的项目中工作正常,但我在较旧的 Play 版本中遇到了这个问题。 我所要做的就是添加
"io.swagger" % "swagger-scala-module_2.11" % "1.0.3"
对于依赖项和所有工作都很有魅力。