Spring bootでHello, World!


WSLの用意

> wsl -l -v
> wsl --unregister Ubuntu-24.04
> wsl -l -v

> wsl --install Ubuntu-24.04
> wsl -d Ubuntu-24.04

JDKのインストール

$ java -version
$ sudo apt update
$ sudo apt list openjdk*
$ sudo apt install openjdk-17-jdk-headless
$ java -version

必要なライブラリをインストール

$ sudo apt install maven jq
$ mvn -v
$ jq --version

Spring Initializrサイトからアプリプロジェクトのモックを取得する。
https://start.spring.io/

画面では以下を選択する。

Project ◎Maven
Language ◎Java
Spring Boot ◎3.4.5
Project Metadata
- Group com.example
- Artifact demo
- Name demo
- Description Demo project for Spring Boot
- Package name com.example.demo
- Packaging ◎Jar
- Java ◎17
Dependencies Spring Web

プロジェクトのひな形を用意

$ cd ~/
$ curl -s https://start.spring.io/starter.zip -d type=maven-project -d dependencies=web -d javaVersion=17 -d language=java -d bootVersion=3.4.5 -d baseDir -d demo -d groupId=com.example -d artifactId=demo -d name=demo -d description='Demo project for Spring Boot' -d packageName=com.example.demo -d packaging=jar -o demo.zip
$ unzip demo.zip -d sample
$ cd sample

$ mvn validate
$ mvn compile
$ mvn test
特定のクラスのみテストを実行する
$ mvn test -Dtest=BlogicTest
特定のクラス、特定メソッドのみテストを実行する
$ mvn test -Dtest= BlogicTest#blogicTest1
ワイルドカードを使って対象となるテストクラスを一括実行する
$ mvn test -Dtest=Blogic*Test

パッケージ生成
JAR、WAR等の成果物を生成する。
packageを実行すればvaliate、compile、test、packageのフェーズも実行される。

$ mvn package

インスタンス起動

$ mvn spring-boot:run

別画面で

$ curl localhost:8080
{"timestamp":"2025-05-13T02:40:14.354+00:00","status":404,"error":"Not Found","path":"/"}

⇒ひとまずWeb API接続ができた
インスタンス停止

$ Ctrl + C

別画面で

$ curl localhost:8080
curl: (7) Failed to connect to localhost port 8080 after 0 ms: Couldn't connect to server

⇒接続エラーとなる

それでは Web API を作成してみます。
2ファイル必要です。


$ vi src/main/java/com/example/demo/Greeting.java
---
package com.example.demo;
 
public class Greeting {
  private final long id;
  private final String content;
 
  public Greeting(long id, String content) {
    this.id = id;
    this.content = content;
  }
 
  public long getId() {
    return id;
  }
 
  public String getContent() {
    return content;
  }
}
---

$ vi src/main/java/com/example/demo/GreetingController.java
---
package com.example.demo;
 
import java.util.concurrent.atomic.AtomicLong;
 
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class GreetingController {
 
  private static final String template = "Hello, %s!";
  private final AtomicLong counter = new AtomicLong();
 
  @GetMapping("/greeting")
  public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
    return new Greeting(counter.incrementAndGet(), String.format(template, name));
  }
}
---

コンパイルとインスタンス起動

$ mvn compile
$ mvn spring-boot:run

HTTPでアクセステスト

$ curl localhost:8080/greeting
{"id":2,"content":"Hello, World!"}

$ curl localhost:8080/greeting?name=111
{"id":1,"content":"Hello, 111!"}