はじめに
SpringBootでの画面描画のためThymeleafを使い始めたのですが、早速動かず詰まったので解消方法を記述しておきます。
環境
- OS: Windows11
- IDE: IntelliJ IDEA 2024.2.4 (Community Edition)
- Java: "21.0.5" 2024-10-15 LTS
- SpringBoot: "3.3.5"
- Thymeleaf: "3.3.5"
問題
Thymeleafが動かない。
具体的には以下のような状態でした。
- HTMLタグの以下の記述に対して、エラーが出る
xmlns:th="http://www.thymeleaf.org"
- エラー文:URI が未登録です (設定 | 言語 & フレームワーク | スキーマと DTD)
- 保存時のアクション:コードの整形を有効にしているが、保存時に
xmlns:th="http://www.thymeleaf.org"
が自動で削除される -
th:text
などの補完が効かない
解決方法
IntelliJ Community版の仕様
- HTMLタグの以下の記述に対して、エラーが出る
xmlns:th="http://www.thymeleaf.org"
- エラー文:URI が未登録です (設定 | 言語 & フレームワーク | スキーマと DTD)
th:text
などの補完が効かない
上記については、IntelliJ Community版がThymeleafのサポートをしていないため起きているようです。有料版の場合、プラグインの利用が可能で、それを使うと補完が効いたり、URIの検出をしてくれるようです。
以下の記事に大変助けられました。
URI is not registered:Community Edition の IntelliJ で表示される警告への対応方法
自動削除への対処法
- 保存時のアクション:コードの整形を有効にしているが、保存時に
xmlns:th="http://www.thymeleaf.org"
が自動で削除される
上記については正直原因がわかりきっていませんが、解決した方法を列挙します
- ブランチをThymeleaf導入前に戻し、再度インストール
- なぜか
src/main/java/resources/templates
ディレクトリがなくなっていたため、手動で作成 -
src/main/java/resources/templates
内にHTMLファイルを作成 - HTMLタグ内の記述を以下のように修正
// lang属性を記述 <html lang="ja" xmlns:th="http://www.thymeleaf.org">
個人的にはlang属性の追記か、Thymeleafの再インストールに効果があったのではないかと考えています。
備考
上記の問題以外にもいくつかハマった点があったので残しておきます。
エラーというよりも、単純に認識不足のため備考として記述します。
ソースコード
// 修正後の動くようになったコードです
@GetMapping("/studentList")
public String getStudentList(Model model) {
List<Student> allStudentList = service.searchForAllStudentList();
List<StudentCourse> allStudentCourseList = service.searchForAllStudentCourseList();
model.addAttribute("studentList",
converter.getStudentDetailsList(allStudentList, allStudentCourseList));
return "studentList";
}
問題
- modelの補完に
addAttribute
がない - 画面を確認すると、studentListという文字列のみ描画される
解決方法
Modelをorg.springframework.ui
で選択する
Modelにはch.qos.logback.core.model
もあり、そちらを選択するとaddAttribute
が選べないようです
@RestController
ではなく@Controller
を使用する
凡ミスですが、これに気づきませんでした。。
これを修正しないと、studentListが文字列で返ってきてしまいます。
おわりに
所属しているコミュニティで同様の問題で詰まっていた方が過去にもいたようですが、最終的にIntelliJを再インストールすることで解消したようです。
上記で直らなければ再インストールを検討してみても良いかもしれません。