Swagger のドキュメントでは、アプリケーションで Swagger を構成するさまざまな方法について説明しています。残念ながら、それらはすべて web.xml を利用しており、web.xml で API バージョンとベース URL をハードコーディングすることに依存しています。
web.xml を使用せず、API バージョンとベース パスをハードコーディングせずに Swagger を構成する方法はありますか?
Swagger のドキュメントでは、アプリケーションで Swagger を構成するさまざまな方法について説明しています。残念ながら、それらはすべて web.xml を利用しており、web.xml で API バージョンとベース URL をハードコーディングすることに依存しています。
web.xml を使用せず、API バージョンとベース パスをハードコーディングせずに Swagger を構成する方法はありますか?
次のアプローチを使用して、リソース XML を使用せずに Glassfish 4 で Swagger を構成しました。
gradle ビルド ファイルごとに次の依存関係を含めます (このアプローチは Maven にも適用されます)。
compile ('com.wordnik:swagger-jaxrs_2.9.1:1.3.0') { グループを除外: 'org.scala-lang', モジュール: 'scala-compiler' }
javax.ws.rs.core.Application を拡張するクラスを作成し、ApplicationPath を構成します。
@ApplicationPath("resources") public class RESTConfig extends Application {}
2a. com.wordnik.swagger.jaxrs.config.DefaultJaxrsConfig を拡張するクラスを作成し、次のように注釈を付けます。
@WebServlet(name = "SwaagerJaxrsConfig" initParams = {@WebInitParam(name="api.version", value="0.1.0"), @WebInitParam(name="swagger.api.basepath", value="http://localhost:8080/resources"})}, loadOnStartup = 2)
public class SwaagerJaxrsConfig extends DefaultJaxrsConfig{}
このアプローチの欠点は、アプリの API バージョンとベース URL が注釈にハードコーディングされることです。これを回避するために、上記のアプローチの代わりに次のアプローチを使用しました
2b. HttpServlet を拡張し、DefaultJaxrsConfig によって行われるブートストラップを実行するクラスを作成します。
@WebServlet(name = "SwaggerJaxrsConfig", loadOnStartup = 2)
public class SwaggerJaxrsConfig extends HttpServlet {
private Logger log = Logger.getLogger(SwaggerJaxrsConfig.class);
@Inject Version version;
@Override public void init(ServletConfig servletConfig) {
try {
super.init(servletConfig);
SwaggerConfig swaggerConfig = new SwaggerConfig();
ConfigFactory.setConfig(swaggerConfig);
swaggerConfig.setBasePath("http://localhost:8080/resources"); //TODO look up app path
swaggerConfig.setApiVersion(version.getVersion());
ScannerFactory.setScanner(new DefaultJaxrsScanner());
ClassReaders.setReader(new DefaultJaxrsApiReader());
} catch (Exception e) {
log.error("Failed to configure swagger", e);
}
}
}