Swagger Codegen で Spring のスタブサーバを作成する

Swagger ファイルからソースコードを生成することができる Swagger Codegen というツールがあります.

今回はこの Swagger Codegen を使い、Spring のスタブサーバを作成してみたいと思います.

Swagger Codegen のセットアップ

GitHub からクローンします.

$ git clone https://github.com/swagger-api/swagger-codegen.git

 
Maven ビルドします.

$ cd path/to/swagger-codegen
$ mvn package

modules/swagger-codegen-cli/target/swagger-codegen-cli.jar が生成されます.

 

Spring のスタブサーバ生成

Swagger ファイルからスタブサーバのソースコードを生成します.

$ java -jar modules/swagger-codegen-cli/target/swagger-codegen-cli.jar generate \
  -i http://petstore.swagger.io/v2/swagger.json \
  -l spring  \
  -o /Users/Daiki/Desktop/stubdemo
  • -i: 入力する Swagger ファイルを指定します
  • -l: 出力するスタブサーバの種類を指定します
  • -o: 出力先ディレクトリを指定します

Swagger ファイルにはサンプルを使用しました.

スタブサーバの種類は色々指定できます.
Swagger-Codegen Template-Creator
 
デフォルトで生成されるプロパティファイルには server.port=-1 が設定されているので、好きな値に変更しましょう.

springfox.documentation.swagger.v2.path=/api-docs
server.contextPath=/v2
server.port=-1
spring.jackson.date-format=io.swagger.RFC3339DateFormat
spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false

 
生成されたコードはステータスコードが全て 501 Not Implemented になっているので、今回は一律 200 OK にする変換を行いました.

$ export LANG=C
$ find . -type f | xargs sed -i '' 's/HttpStatus.NOT_IMPLEMENTED/HttpStatus.OK/g'

ステータスコードについては議論が行われたようですが、501 Not Implemented に終着したようです.
Change default generated status to NOT_IMPLEMENTED in controller
 
Spring プロジェクトを Maven ビルドします.

$ cd /path/to/spring-project
$ mvn package

 
target/swagger-spring-1.0.0.jar が生成されます.

 

スタブサーバ起動

java コマンドでスタブサーバを起動します.

$ java -jar target/swagger-spring-1.0.0.jar


  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.5.9.RELEASE)

2019-02-01 17:18:53.409  INFO 41224 --- [           main] io.swagger.Swagger2SpringBoot            : Starting Swagger2SpringBoot v1.0.0 on aa367474noMacBook-Air.local with PID 41224 (/Users/Daiki/Desktop/mockdemo/target/swagger-spring-1.0.0.jar started by Daiki in /Users/Daiki/Desktop/mockdemo)
2019-02-01 17:18:53.423  INFO 41224 --- [           main] io.swagger.Swagger2SpringBoot            : No active profile set, falling back to default profiles: default
2019-02-01 17:18:53.703  INFO 41224 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@45283ce2: startup date [Fri Feb 01 17:18:53 JST 2019]; root of context hierarchy
2019-02-01 17:18:59.856  INFO 41224 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2019-02-01 17:18:59.895  INFO 41224 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-02-01 17:18:59.897  INFO 41224 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.23
2019-02-01 17:19:00.159  INFO 41224 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/v2]     : Initializing Spring embedded WebApplicationContext

・・・

2019-02-01 17:19:05.808  INFO 41224 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2019-02-01 17:19:05.822  INFO 41224 --- [           main] io.swagger.Swagger2SpringBoot            : Started Swagger2SpringBoot in 14.535 seconds (JVM running for 15.742)
2019-02-01 17:20:30.145  INFO 41224 --- [nio-8080-exec-7] o.a.c.c.C.[Tomcat].[localhost].[/v2]     : Initializing Spring FrameworkServlet 'dispatcherServlet'

http://localhost:8080/v2/swagger-ui.html で Swagger-UI にアクセスできます.

 

以上です.