Spring Initializerを使ってHello World


はじめに

Spring Fest 2020でSpring Initializerを使ったプロジェクトの作成方法が紹介されていました。
これまでSpringBootでの自主開発に挑戦と挫折を繰り返してきましたが、Hello Worldまでたどり着いたのでその記録を残します。

環境

  • OS: macOS Mojave 10.14.6
  • IDE: Visual Studio Code

下準備

Javaのインストール

HomebrewでJDK11をインストールします。
インストールするだけだと自動でアップデートされてしまうので、バージョンを固定するためにtapコマンドをはさみます。

$ brew tap AdoptOpenJDK/openjdk
$ brew install --cask adoptopenjdk11
  ~~
🍺  adoptopenjdk11 was successfully installed!

# brewでインストールしたパッケージにJDKが含まれているか確認
$ brew list
  ~~  openjdk

# Javaのバージョンを確認
$ java -version
openjdk version "11.0.9.1" 2020-11-04
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.9.1+1)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.9.1+1, mixed mode)

# インストールされたディレクトリの場所を確認
$ /usr/libexec/java_home -v 11
/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home

JAVA_HOME と PATH を設定

# 現在の設定を確認
$ export -p

# 設定追加
$ export JAVA_HOME=`/usr/libexec/java_home -v 11`
$ PATH=${JAVA_HOME}/bin:${PATH}

# 追記されているか確認
$ export -p
declare -x JAVA_HOME="/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home"
declare -x PATH="/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home/bin

# sourceコマンドを実行してPATHを通す
$ source ~/.bash_profile

$ which java
/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home/bin/java

・GitHub AdoptOpenJDK - HomeBrew TAP
https://github.com/AdoptOpenJDK/homebrew-openjdk
・Java 11 (OpenJDK: AdoptOpenJDK) を Homebrew で macOS にインストールする
https://qiita.com/niwasawa/items/460ccd0fa0041e7a2491

Mavenのインストール

同じくbrewでインストールします

$ brew install maven
$ brew list
  ~~  maven

$ mvn --version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /usr/local/Cellar/maven/3.6.3_1/libexec
Java version: 11.0.9.1, vendor: AdoptOpenJDK, runtime: /Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.14.6", arch: "x86_64", family: "mac"

# setting.xmlを.m2フォルダに移動
$ cp /usr/local/Cellar/maven/3.6.3_1/libexec/conf/settings.xml ~/.m2

Visual Studio Codeの設定

拡張機能のinstall

それぞれPackという名前の通り色々内包されています。詳細はリンク先まで。

Spring Initializer

Project作成

https://start.spring.io/
以下の内容で「GENERATE」すると、ダウンロードフォルダにzipファイルが格納されます。

VSCodeで開く

File > Open > 展開したフォルダを選択
DemoApplication.javaにmainメソッドが作成されています。

Hello World

Controller

  • /src/main/java/com/example配下にControllerフォルダを作成する
  • Controllerフォルダの配下にIndexController.javaを作成する
IndexController.java
package com.example.demo.Controller;

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

@RestController
public class IndexController {

    @GetMapping("/")
    public String index(){
        return "Hello World";
    }
}

実行

MAVEN から clean, package, install
Spring boot dashboard から start or debug

ブラウザでhttp://localhost:8080をたたく

成功です

Hello World -Thymeleaf

次は文字列ではなくHTMLを返せるように修正します。

pom.xml

dependenciesに以下を追加して再ビルド

pom.xml
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-thymeleaf</artifactId>
  <version>2.4.1</version>
</dependency>

Maven repository - Spring Boot Starter Thymeleaf
https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-thymeleaf

Controller

IndexController.java
package com.example.demo.Controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class IndexController {

    @RequestMapping("/")
    public String index(){
        return "index"; //returnするHTMLのファイル名
    }
}

HTML

/src/main/resources/templatesindex.htmlを作成

index.html
<!DOCTYPE html>
<html xmlns:th="http://thymeleaf.org">
    <head>
        <meta charset="utf-8">
        <title>Sample</title>
    </head>
    <body>
        <h1>HelloWorld Thymeleaf</h1>
    </body>
</html>

実行

Spring boot dashboard から start or debug
ブラウザでhttp://localhost:8080をたたく

成功です

もしも以下のようなエラーが出てしまったら、.m2/repository 配下のフォルダを全て削除して再ビルドを試してみてください。私はしばらくはまってしまったのですがその方法で解決しました。

javax.servlet.ServletException: Circular view path [~]: would dispatch back to the current handler URL [/~] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)