CONTENTS コンテンツ

2021.10.29

Springboot+Thymeleafの個人的に詰まったところ

はじめまして、東京オフィスのたまです。

初めてのブログ更新で何を書くべきか困っていましたが、個人的な備忘録も兼ねて、研修で行ってきたSpringbootのことを書いていきたいと思います。

環境は、Springboot+Thymeleafで、DAOに任せて複雑なSQLは使わない内容でした。

誰得な記事になりそうですが、よろしくお願いします。m(__)m

 

JpaRepositoryとRepository

JpaRepository

・インターフェースとして作成

・アノテーションはなし。

・継承時にエンティティの型を指定するので、SpringとRepositoryの橋渡し的な役割。

・Specificationを使うときは、JpaSpecificationExecutorを継承させておく。

Repository

・クラスとして作成

・@Repositoryをクラスに付ける。

・@AutowiredでJpaRepositoryの子インターフェースを呼び出す。

・Serviceクラスからこちらで実装したメソッドを呼び出す。

 

上記の2つは作成する時にクラスとインターフェースを取り違えやすく、何度も既存プロジェクトを参考にして作成したりしていました。

どちらも今回の研修では、ほとんどコードを書かないクラスでした。

 

Service

アノテーション:@Service

主なロジックを担当するクラスで、データのやり取りから整形までこなし、一番ステップ数が増えやすいクラスだと思います。

・Specificationで検索条件の列を指定するときは、エンティティの変数名を渡すこと。

↑が一番厄介な仕様でした。よくよく考えてみれば、Entityで対象のカラムを変えることもあるので、管理のしやすさからこうなっているのだと思います。

 

Controller

アノテーション:@Controller

画面遷移と表示内容を制御するクラス。

Formクラスを使ってバリデーションの結果を返す時は、BindingResultを引数に追加するのを忘れないように。

 

FormとValidationMessages.properties

Form

・数値型に@Sizeは使えない。

・バリデーションメッセージをプロパティから読み込むときは”{}”で括ること。

ValidationMessages.properties

・キー名は.(ピリオド)で区切る。他の記号を使うとエラーが出ることもあるので要注意。

・文字コードを指定できるエディタを使うようにしましょう。

ここまでは他のフレームワークでアノテーションベースのものを使っていた人はすんなりといけると思います。

 

SpringSecurity

SecurityConfigのアノテーション:@EnableWebSecurity

Handlerのアノテーション:@Component

この研修で一番の問題児でした。が、研修直後のレベルで業務上これを扱うことはないと思っています。

基本的な構造はSecurityConfigに認証が必要なページとそうでないページを紐づけてログイン画面を表示させ、SuccessHandlerとFailureHandlerでログイン成否の処理を分けます。

認証にDBの情報を使う場合は、

・認証用EntityにUserDetailsをimplementsする。

・ServiceクラスにUserDetailServiceをimplementsしてloadUserByUsername()をオーバーライドしておきます。

(必然的にRepositoryにもfindメソッドが必要です)

認証成功時、失敗時ともにリダイレクトで次のページに遷移した方が、実装は簡単だと思いました。

 

思っていたより全然書くことがなかったので、ついでにThymeleafの備忘録も書いておきます。

EL式

今までバックエンドの案件が多く、がっつりとjavascriptを触ることがなかったので条件分岐一つ取っても苦労しました。

th:if=””の中で”1 = ${1}”でも、”${1} = ${1}”でも、”${1 = 1}”でも動いてしまうので、漠然と怖い意識があります。

基本的には${hogehoge!=null && hogehoge!=””}と一つの{}内でできる限り書いた方が見やすく、論理和”||”などもできるのでお勧めです。

 

th:href

th:href=”@{${url}(from=${from}, to=${to})}”

これだけでリクエストパラメータをきちんと並べたURLが形成されるのは感動しました。URLエンコードのおまけつきです。すごい。

 

th:each

th:each=”item, stat : ${listItem}”

${item, stat : …}や${item, stat} : ${…}などと書かないように注意。

(EL式をよく触る人はしないミスかと思いますが、私はこれに時間を取られました。)

statはstat.indexで0スタート、stat.countで1スタートと、地味に便利。

 

以上が備忘録です。

どことなく感想が混じっていてこれを見て参考になる人がいるとは思えませんが、

私にはほのぼのとした日常系ブログは書けずこれが精一杯でした。

 

今は、これから入る案件のためにVue.jsを勉強しています。

やっぱりバリデーションはリアルタイムで画面が変わる方が親切ですよね。

次にブログを更新できる機会があれば、Vueについて書くかもしれません。

その時は、今回のような記事にならないようにしっかりと理解して要点をまとめておこうと思います。

たま先生の次回作にご期待ください!