IntelliJ IDEA で Spring Boot 入門

経緯

今のプロジェクトはSpring Frameworkを用いているのですが、すでに組み上がった状態から私が参画しているため、構築の仕方が分かっていないという課題がありました。

そのため、当初はSpringでHello Worldしようと考えていました。しかし、それもかなり難しいと分かったので、お手軽なSpring BootでHello Worldすることにしました。

また、EclipseならびにSTSではなく、IntelliJ IDEAを使ってみようと思います。

ゴール

Spring Bootの以下のチュートリアルの「HTTP is the Platform」の項まで進めること。

spring.io

使用プログラム

始め方

IDEA上でSpring Bootプロジェクトを始める方法が紹介されていました。これを見つけられたおかげでだいぶ楽になりました!

qiita.com

これに基づいてやっていきます。

まず、IntelliJ IDEAを開き、「File > New > Project」*1

「Spring Initializer」を選択して「Next」 f:id:alek3:20181028205140p:plain

Artifactを適当なプロジェクト名、Typeを今回は「Maven POM」に設定する。 f:id:alek3:20181028205616p:plain

Dependencyを選択します。チュートリアルに従い、CoreからLombok、WebからWeb、SQLからJPAとH2を選択します。*2 f:id:alek3:20181028211917p:plain

次の画面でプロジェクト名とフォルダを設定して、「Finish」をクリック。

プロジェクトが作成されました。なんか下で動いている感が出ているので、それが終わったタイミングで右下の「Import Changes」をクリック。(「Enable Auto-Import」をクリックしてもよい) f:id:alek3:20181028210335p:plain


(ここら辺から手順が怪しいですが)左上にある「Project」を右クリックして、「New > Module」を選択。

Artifactを適当に設定し*3、Typeを「Maven POM」にして「Next」をクリック。 f:id:alek3:20181028211833p:plain

Dependencyはプロジェクト作成の時と同じです。 f:id:alek3:20181028212135p:plain

次の画面でモジュールの格納場所とかをプロジェクトのルートフォルダの下に設定して「Finish」をクリック。


最後に、Project Structureを設定します。

「File > Project Structure」

「Module」を選択し、作成したModuleを選択、「Javaディレクトリを選択した状態で、「Sources」をクリック。 f:id:alek3:20181028213257p:plain

以上で終わりです。あとはチュートリアルにしたがってソースを書いていくだけです。

様々なトラブル

……と順調に進むはずもなく、様々なエラーに見舞われました。

エラーが発生してアプリケーションが実行できない

アプリケーションを実施したところ、以下のエラーが発生しました。

Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXBException

ググったらドンピシャの回答がありました。ありがとうございます!

qiita.com

ただ元のレポジトリにはこれがpom.xmlに入ってなかったのでどうして必要なのかは不明。

@Dataアノテーション付与したのにGetterとSetterが設定されてないっぽい

以下のようなエラーが発生していてGetterやSetterがIDEに認識されていません。(赤字になっています。)

f:id:alek3:20181028215227p:plain

これはIDEAの設定の問題でした。ここを読んでその通りに実行すると解消されます。*4

stackoverflow.com

POSTの結果が想定通りにならない

チュートリアル内で以下のコマンドをたたくように書かれていました。

curl -X POST localhost:8080/employees -H 'Content-type:application/json' -d '{"name": "Samwise Gamgee", "role": "gardener"}'

しかし、このコマンドをそのままコピペするのは誤りで、うまくいきません。

誤ったコマンドとその結果

C:\Users\hoge\IdeaProjects\spring-boot-tutorial>curl -X POST localhost:8080/employees -H 'Content-type:application/json' -d '{"name": "Samwise Gamgee", "role": "gardener"}'
{"timestamp":"2018-10-28T08:28:10.333+0000","status":415,"error":"Unsupported Media Type","message":"Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported","path":"/employees"}curl: (6) Could not resolve host: Samwise Gamgee,
curl: (6) Could not resolve host: role
curl: (3) [globbing] unmatched close brace/bracket in column 9

かなり調べたらこの記事にたどり着いきました。

stackoverflow.com

ダブルクォーテーションのみを使ってJSON内はエスケープして使えというものです。

正しいコマンドとその結果

C:\Users\hoge\IdeaProjects\spring-boot-tutorial>curl -X POST localhost:8080/employees -H "Content-type:application/json" -d "{\"name\": \"Samwise Gamgee\", \"role\": \"gardener\"}"
{"id":3,"name":"Samwise Gamgee","role":"gardener"}

前にもこの罠に陥った気がします。お恥ずかしい……。

まとめ

どうもSpringは入門するのが難しい印象があるのですが、自力でそこそこ進められたので良かったです。

*1:ウェルカムページが開かれていた場合は、新しいプロジェクトを作るみたいなやつをクリックする

*2:これがpom.xmlに反映されます。

*3:今回はチュートリアルの内容から推測してnonrestにしましたが、実際何でもいい

*4:Slf4jのlogが認識されないエラーも同時に解消されます。