2017-02-21 5 views
0

Beim Versuch, swagger in meine API zu integrieren, stoße ich auf einige Probleme.Provider io.swagger.scala.converter.SwaggerScalaModelConverter konnte nicht instanziiert werden

Meine API verwendet Jersey 2.22 und die Sprache ist Scala. Ich habe die folgenden Abhängigkeiten zu meinem pom hinzugefügt:

<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> 

Mein Plugin wie folgt konfiguriert ist:

<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> 

Wenn ich renne mvn kompilieren, der folgende Fehler auftritt:

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.access$100(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$1.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 

Wenn ich das Scala-Swagger-Modul weglasse, funktioniert die Kompilierung einwandfrei und ich bekomme einen gültigen JSON (alle Ressourcenbeschreibungen werden perfekt generiert), aber die Felder in den Scala-Fallklassen werden nicht generiert:

@ApiModel("some model") 
case class HelloModel(@(ApiModelProperty @field)(dataType = "Int", value = "some int", name = "tries") tries: Int) 

Ergebnisse in:

"definitions" : { 
    "some model" : { 
     "type" : "object" 
    } 
    } 

bekam jemand eine Ahnung?

Antwort

2

Nun, ich habe es nach einigen schweren Debugging herausgefunden. Es scheint, dass das von mir verwendete swagger-maven-plugin (3.1.1) swagger-core 1.5.4 verwendet. Diese Swagger-Core-Abhängigkeit war abhängig von Jackson 2.4.5.

Das Swagger-Scala-Modul_2.11 verwendet Jackson 2.8.7. Der Fehler "Kann nicht von der finalen Klasse erben" stammte von der TypeReference-Klasse, die offenbar in 2.8.7 eingeführt wurde.

Die Lösung wurde mit der Prahlerei-scala-module_2.11 Innenseite der Prahlerei-Maven-Plugin von dem Block Abhängigkeiten mit:

<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> 

Dies wird den Prahlerei-Maven-Plugin Einsatz Prahlerei Kern macht 1.5 .12 statt der bereitgestellten 1.5.9.

0

Ich hatte das gleiche Problem mit SBT in einem Play Framework 2.4.6 Projekt. Die Antwort von GieJay hat sich auch in meinem Fall bewährt, ich wollte nur auf meine Lösung in einer SBT-Umgebung hinweisen; in meinem libraryDependencies hatte ich

"io.swagger" %% "swagger-play2" % "1.5.1"

die in einem anderen Projekt mit Wiedergabe 2.4.8 funktioniert gut, aber ich habe dieses Problem in einer älteren Version abspielen. Alles, was ich tun musste, war

"io.swagger" % "swagger-scala-module_2.11" % "1.0.3"

zu den Abhängigkeiten und alle Arbeiten wie ein Charme.

Verwandte Themen