LoginSignup
0
1

More than 3 years have passed since last update.

SpringBoot + Swagger で REST APIを実装する

Last updated at Posted at 2019-12-07

自分用メモ
 
【IDE】
 InteliJ IDEA CE

Spring initializrでプロジェクトを作成

Spring initializr
 
【Project】
 Gradle を選択
 
【Language】
 Javaを選択
 
【SpringBoot】
 2.2.2を選択(SNAPSHOTがついていない最新のもの)
 
【Project Metadata】
 Group:適当に設定
 Artifact:適当に設定
 Options:Java8を選択、それ以外は任意で。(僕はJava8を選択しただけで、他は触ってません)
 
【Dependencies】
 Options:「MySQL」, 「Lombok」, 「Spring Data Redis」, 「Spring Web」, 「Spring Data JPA」
 

inteliJでプロジェクトを開く

→「プロジェクトのインポート」 → 上記で作成したプロジェクトを選択してオープン
image.png
 
→「既存モデルからプロジェクトを作成する」にチェックして、Gradleを選択 → 完了
image.png

 

inteliJでプロジェクトを開いたときに、以下のようなポップアップが表示される場合

image.png
 
→「preference」
image.png
 
→「ビルド・実行・デプロイ」 → 注釈プロセッサー → 「注釈処理を使用可能にする」にチェック → 適用
image.png
 

実行時、springboot finished with non-zero exit value 1で落ちる

少しハマりました。
MySQLの接続情報を記載しないといけないんですね・・・。
 

docker/docker-compose.yml
version: '3'
services:
  db:
    image: mariadb:latest
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
    environment:
      - MYSQL_ROOT_USER=root
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=ここは適当なDB名に変更してください
      - MYSQL_USER=user
      - MYSQL_PASSWORD=user
    volumes:
      - db_data:/var/lib/mysql
      - ./db_data:/docker-entrypoint-initdb.d
    ports:
      - '3333:3306'

volumes:
  db_data:
    driver: local

 

src/main/java/resources/application.yml
spring:
  datasource:
    url: jdbc:mysql://localhost:3333/docker-composeのMYSQL_DATABASEに指定した名称
    username: user
    password: user

  jpa:
    hibernate:
      ddl-auto: none

→僕はapplication.propertiesをapplication.ymlにリネームしてます。
 
dockerのDBコンテナを立ち上げ

docker-compose up -d

 
実行!!!

16:11:57: Executing task 'RedisApiSampleApplication.main()'...

> Task :compileJava UP-TO-DATE
> Task :processResources UP-TO-DATE
> Task :classes UP-TO-DATE

> Task :RedisApiSampleApplication.main()

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

2019-12-07 16:11:58.851  INFO 6017 --- [           main] r.r.RedisApiSampleApplication            : Starting RedisApiSampleApplication on ~ with PID 6017 (/Users/~/Desktop/workspace/redis-api-sample/build/classes/java/main started by ~ in /Users/~/Desktop/workspace/redis-api-sample)
2019-12-07 16:11:58.855  INFO 6017 --- [           main] r.r.RedisApiSampleApplication            : No active profile set, falling back to default profiles: default
2019-12-07 16:11:59.501  INFO 6017 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!
2019-12-07 16:11:59.503  INFO 6017 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2019-12-07 16:11:59.525  INFO 6017 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 12ms. Found 0 JPA repository interfaces.
2019-12-07 16:11:59.541  INFO 6017 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!
2019-12-07 16:11:59.542  INFO 6017 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode.
2019-12-07 16:11:59.552  INFO 6017 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 1ms. Found 0 Redis repository interfaces.
2019-12-07 16:11:59.885  INFO 6017 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2019-12-07 16:12:00.298  INFO 6017 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2019-12-07 16:12:00.314  INFO 6017 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-12-07 16:12:00.315  INFO 6017 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.29]
2019-12-07 16:12:00.399  INFO 6017 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-12-07 16:12:00.399  INFO 6017 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1467 ms
2019-12-07 16:12:00.628  INFO 6017 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
2019-12-07 16:12:00.688  INFO 6017 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate Core {5.4.9.Final}
2019-12-07 16:12:00.818  INFO 6017 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.1.0.Final}
2019-12-07 16:12:00.906  INFO 6017 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2019-12-07 16:12:01.097  INFO 6017 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2019-12-07 16:12:01.124  INFO 6017 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.MySQL55Dialect
2019-12-07 16:12:01.311  INFO 6017 --- [           main] o.h.e.t.j.p.i.JtaPlatformInitiator       : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2019-12-07 16:12:01.317  INFO 6017 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2019-12-07 16:12:01.365  WARN 6017 --- [           main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2019-12-07 16:12:01.517  INFO 6017 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-12-07 16:12:02.198  INFO 6017 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2019-12-07 16:12:02.201  INFO 6017 --- [           main] r.r.RedisApiSampleApplication            : Started RedisApiSampleApplication in 3.904 seconds (JVM running for 4.372)

無事、エラーが消えて実行できました。
 

Spring Foxの導入

build.gradleのdependenciesに追記します。

build.gradle
.
..
...
dependencies {
    implementation "io.springfox:springfox-swagger2:2.9.2"
    implementation 'io.springfox:springfox-swagger-ui:2.9.2'  // Swagger UIを利用するため
    ...
    ..
    .
}
...
..
.

 
追記後は、プロジェクトをリフレッシュします。
右端の「gradle」→再読み込みみたいなアイコンクリック
image.png
 

swagger-foxを有効にする

Swagger用のJavaConfigを用意していない場合

SpringApplication.run()があるクラスに@EnableSwagger2を付与する。

src/main/java/example/Application.java
package redisapisample.redisapisample;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import springfox.documentation.swagger2.annotations.EnableSwagger2; ←これを追記

@EnableSwagger2 ←これを追記
@SpringBootApplication
public class RedisApiSampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(RedisApiSampleApplication.class, args);
    }

}

Swagger用のJavaConfigを用意する場合

SwaggerConfig.java(ファイル名は任意でOK)を作成し、@Configuration@EnableSwagger2を付与するだけ。

src/main/java/example/config/SwaggerConfig.java
package redisapisample.redisapisample.config;

import org.springframework.context.annotation.Configuration;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfig {
}

 

swagger-uiを表示する

アプリケーション実行後、http://localhost:8080/swagger-ui.htmlにアクセス
image.png
 
swagger-uiを表示することができました。
 

APIの実装

Controller

src/main/java/example/RestExampleController.java
package redisapisample.redisapisample.Controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController // Web Controllerとして利用するためのBean登録
@RequestMapping("/redis") // リクエストURL
public class RestExampleController {
    @GetMapping("/register")
    public String registerString() {
        return "ok";
    }
}

とりあえずこんだけ。
 

Swagger-uiから実行してみる

swaggerに先ほど作成したcontrollerが追加されている。
image.png
 
・try it outをクリック
image.png
 
・executeをクリックで実行
image.png
 
・200でちゃんと「ok」が返ってきている。
image.png

 

備考

アプリケーションの実行

■bootRunで実行
image.png
 
■Application.javaを右クリックで実行
image.png

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1