経緯
今のプロジェクトはSpring Frameworkを用いているのですが、すでに組み上がった状態から私が参画しているため、構築の仕方が分かっていないという課題がありました。
そのため、当初はSpringでHello Worldしようと考えていました。しかし、それもかなり難しいと分かったので、お手軽なSpring BootでHello Worldすることにしました。
また、EclipseならびにSTSではなく、IntelliJ IDEAを使ってみようと思います。
ゴール
Spring Bootの以下のチュートリアルの「HTTP is the Platform」の項まで進めること。
使用プログラム
- IntelliJ IDEA
始め方
IDEA上でSpring Bootプロジェクトを始める方法が紹介されていました。これを見つけられたおかげでだいぶ楽になりました!
これに基づいてやっていきます。
まず、IntelliJ IDEAを開き、「File > New > Project」*1
「Spring Initializer」を選択して「Next」
Artifactを適当なプロジェクト名、Typeを今回は「Maven POM」に設定する。
Dependencyを選択します。チュートリアルに従い、CoreからLombok、WebからWeb、SQLからJPAとH2を選択します。*2
次の画面でプロジェクト名とフォルダを設定して、「Finish」をクリック。
プロジェクトが作成されました。なんか下で動いている感が出ているので、それが終わったタイミングで右下の「Import Changes」をクリック。(「Enable Auto-Import」をクリックしてもよい)
(ここら辺から手順が怪しいですが)左上にある「Project」を右クリックして、「New > Module」を選択。
Artifactを適当に設定し*3、Typeを「Maven POM」にして「Next」をクリック。
Dependencyはプロジェクト作成の時と同じです。
次の画面でモジュールの格納場所とかをプロジェクトのルートフォルダの下に設定して「Finish」をクリック。
最後に、Project Structureを設定します。
「File > Project Structure」
「Module」を選択し、作成したModuleを選択、「Java」ディレクトリを選択した状態で、「Sources」をクリック。
以上で終わりです。あとはチュートリアルにしたがってソースを書いていくだけです。
様々なトラブル
……と順調に進むはずもなく、様々なエラーに見舞われました。
エラーが発生してアプリケーションが実行できない
アプリケーションを実施したところ、以下のエラーが発生しました。
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXBException
ググったらドンピシャの回答がありました。ありがとうございます!
ただ元のレポジトリにはこれがpom.xmlに入ってなかったのでどうして必要なのかは不明。
@Dataアノテーション付与したのにGetterとSetterが設定されてないっぽい
以下のようなエラーが発生していてGetterやSetterがIDEに認識されていません。(赤字になっています。)
これはIDEAの設定の問題でした。ここを読んでその通りに実行すると解消されます。*4
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
かなり調べたらこの記事にたどり着いきました。
ダブルクォーテーションのみを使って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は入門するのが難しい印象があるのですが、自力でそこそこ進められたので良かったです。