JAX-RS RESTプロジェクトをSwaggerと統合しています。多くのドキュメントとチュートリアルを読みました。私のお気に入りの図は次のとおりです( Philipp Hauerのブログ に感謝):
その画像は、Swaggerがどのように機能するかを理解するのに大いに役立ちました。
Swaggerがどのように機能するかを学んだ後、pom.xml
を変更しました。
プロジェクトにswagger-jersey2-jaxrs
依存関係を追加しました。これにより、説明されているSwagger関連のアノテーションを使用できるようになります ここ :
<!-- for Swagger-Core Annotations -->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-jersey2-jaxrs</artifactId>
<version>1.5.13</version>
</dependency>
重要:guavaライブラリがこの依存関係に属しているため、最新の1.15.18 swagger-jersey2-jaxrs依存関係を使用できません。これにより、クラスローダーに重大な問題が発生しました。最新(v5.181)で Payara appserver:
Exception Occurred :Error occurred during deployment: Exception while loading the app : Java.lang.IllegalStateException: ContainerBase.addChild: start: org.Apache.catalina.LifecycleException: org.Apache.catalina.LifecycleException: Java.lang.NoSuchMethodError: com.google.common.collect.Sets$SetView.iterator()Lcom/google/common/collect/UnmodifiableIterator;. Please see server.log for more details. ]]
とにかく、次のプラグインも私のpom.xmlに追加しました。これは、swagger-ui
パーツをダウンロードし、mavenターゲットフォルダーに解凍します。
<plugin>
<groupId>com.googlecode.maven-download-plugin</groupId>
<artifactId>download-maven-plugin</artifactId>
<version>1.4.0</version>
<executions>
<execution>
<id>swagger-ui</id>
<phase>prepare-package</phase>
<goals>
<goal>wget</goal>
</goals>
<configuration>
<url>https://github.com/swagger-api/swagger-ui/archive/v${version.swagger-ui}.tar.gz</url>
<unpack>true</unpack>
<outputDirectory>${project.build.directory}</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
ここでの私の問題は、プロキシサーバーの背後にいるため、HTTPSプロキシ構成をmavensetting.xmlに追加する必要があることでした。
最後に、pom.xmlにmaven-war-plugin
を追加しました。これにより、swagger-ui関連の静的ファイルが最終的なwarファイルにコピーされます。
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<warName>${project.build.finalName}</warName>
<webappDirectory>${basedir}/target/${project.build.finalName}</webappDirectory>
<webResources>
<webResource>
<directory>${project.build.directory}/swagger-ui-${version.swagger-ui}/dist</directory>
<targetPath>swagger</targetPath>
</webResource>
</webResources>
</configuration>
</plugin>
次のコードでSwaggerドキュメントジェネレータを初期化します。
@ApplicationPath("api")
public class Configurator extends Application {
public Configurator() {
BeanConfig beanConfig = new BeanConfig();
beanConfig.setVersion("1.0.0");
beanConfig.setSchemes(new String[]{"http"});
beanConfig.setHost("localhost:8080");
beanConfig.setBasePath("my-rest-1.0.0/api");
beanConfig.setResourcePackage(EchoRest.class.getPackage().getName());
beanConfig.setTitle("JAX-RS + Swagger and Swagger UI Example");
beanConfig.setDescription("Sample RESTful API built using JAX-RS, Swagger and Swagger UI");
beanConfig.setScan(true);
}
}
正常に動作します。 http:// localhost:8080/my-rest-1.2.0/api/swagger.json は、適切なSwaggerドキュメントとともに返されます。
[〜#〜]しかし[〜#〜]
swagger/index.html
ファイルのJavaScript部分にあるハードコードされたURL値をデフォルトの http://petstore.swagger.io/v2/swagger.json から自分のURLに上書きする必要があります。 mavenプラグインを介してswagger-uiを自動的にダウンロードしてコピーしますが、mavenでのコンパイル中にURL変数の値を自動的に変更する方法がわかりません。Configurator
クラスで使用されるハードコードされたバージョン、ホスト、およびベースパスは、しばらくすると正しくなりません。アプリケーションのルートURLと@ApplicationPath( "api")アノテーションの値に基づいて、この値を自動的に生成できますか?特にあなたのニーズの1つを指摘するために、ハードコードされたURLを置き換えるためにMavenのreplacer-pluginを使用しています。
<!-- replace name of the specification file to show-->
<plugin>
<groupId>com.google.code.maven-replacer-plugin</groupId>
<artifactId>replacer</artifactId>
<executions>
<execution>
<phase>prepare-package</phase>
<goals>
<goal>replace</goal>
</goals>
</execution>
</executions>
<configuration>
<file>${project.build.directory}/swagger-ui/META-INF/resources/webjars/swagger-ui/${swagger-ui.version}/index.html</file>
<replacements>
<replacement>
<token>"https://petstore.swagger.io/v2/swagger.json"</token>
<value>location.protocol + '//' + location.hostname+':'+location.port+'/${project.artifactId}-${project.version}/Your-URL/openapi.json'</value>
</replacement>
</replacements>
</configuration>
</plugin>