私はIntelliJでスプリングブートとthymeleafを使用して短いWebフォームアプリケーションを書いていますが、htmlファイルでは、モデルのすべてのフィールドを解決できないようです。ここに私のコードがあります:
コントローラークラス:
@Controller
public class IndexController{
@RequestMapping(value = "/", method = RequestMethod.GET)
public String index(){
return "index";
}
@RequestMapping(value="/", method = RequestMethod.POST)
public String addNewPost(@Valid Post post, BindingResult bindingResult, Model model){
if(bindingResult.hasErrors()){
return "index";
}
model.addAttribute("title",post.getTitle());
model.addAttribute("content",post.getContent());
return "hello";
}
}
モデルクラス:
public class Post {
@Size(min=4, max=35)
private String title;
@Size(min=30, max=1000)
private String content;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
次に、index.htmlがあります。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head lang="en">
<title>Spring Framework Leo</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<h3>Spring Boot and Thymeleaf</h3>
<form action="#" th:action="@{/}" th:object="${post}" method="post">
<table>
<tr>
<td>Title:</td>
<td><input type="text" th:field="*{title}" /></td>
<td th:if="${#fields.hasErrors('title')}" th:errors="*{title}">Title error message</td>
</tr>
<tr>
<td>Content:</td>
<td><input type="text" th:field="*{content}" /></td>
<td th:if="${#fields.hasErrors('content')}" th:errors="*{content}">Content error message</td>
</tr>
<tr>
<td><button type="submit">Submit post</button></td>
</tr>
</table>
</form>
「投稿」、「タイトル」、「コンテンツ」の下には常に赤い線がありますが、解決方法がわかりません。それはIntelliJの問題ですか、それとも私のコードの問題ですか?
これはIntelliJの問題です: IDEA-132738 。
基本的に、Spring Bootを使用してすべてを自動構成すると、IntelliJはモデル変数を見つけることができません。
使用できます Alt+Enter ビューの「未解決のモデル属性」を取り除くために、「コメント注釈で外部変数を宣言する」という意図を呼び出すショートカット。
次のコードをhtml
ファイルに追加します。
<!--/* Workaround for bug https://youtrack.jetbrains.com/issue/IDEA-132738 -->
<!--@thymesVar id="post" type="your.package.Post"-->
<!--@thymesVar id="title" type="String"-->
<!--@thymesVar id="content" type="String"-->
<!--*/-->
#temporals
オブジェクトの変換にthymeleaf-extras-Java8time
からのJava.time
など、ThymeLeafによって自動的に構築された拡張オブジェクトを使用する場合:
<span th:text="${#temporals.format(person.birthDate,'yyyy-MM-dd')}"></span>
intelliJはそれらを解決できず、同様のコードを使用し、オブジェクト名の前に#
を追加するだけです。
<!--@thymesVar id="#temporals" type="org.thymeleaf.extras.Java8time.expression.Temporals"-->
ステータス2017.3
Spring Boot自動構成MVCアプリケーションのサポートが完了し、バンドルされているすべての自動構成ビュータイプがサポートされます。
修正バージョン:2017.3
コードには2つの異なる部分がありました。1つ目はエラーを表示し、2つ目はエラーを表示していませんでした。 xmlns:th属性に違いがあることに気付きました。
最初のページ:動作していません!
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
2ページ目:作業中!
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://thymeleaf.org">
www。を削除しました。
もう1つ追加します。上記のように、この問題はIntelliJ 2017.で修正されました。これも確認できます。
しかし、これは、すべての属性を定義する場合にのみ当てはまることに気付きました直接この:
@RequestMapping(value = "/userinput")
public String showUserForm(Model model){
model.addAttribute("method", "post");
model.addAttribute("user", new User());
return "userform";
}
モデルの属性を定義するサブ関数を使用している場合(下記の例を参照)、IntelliJはHTMLテンプレートで属性を見つけることができません。
例:
@RequestMapping(value = "/userinput")
public String showUserForm(Model model){
return doIt(model);
}
private String doIt(Model model) {
model.addAttribute("method", "post");
model.addAttribute("user", new User());
return "userform";
}
したがって、必ずビュー関数内にコードを直接配置してください!
Intellij 2018.1.6 Ultimate Editionで手動で有効にしました。続く手順
プロジェクトツールウィンドウを開きます(例:[表示] | [ツールウィンドウ] | [プロジェクト])。
プロジェクトまたはモジュールフォルダーを右クリックし、[フレームワークサポートの追加]を選択します。
公式リファレンス: https://www.jetbrains.com/help/idea/thymeleaf.html#0c8052be
私の場合、問題はapplication.propertiesに次のものがあることでした。
spring.thymeleaf.prefix=file:src/main/resources/templates/
spring.thymeleaf.cache=false
これらのプロパティを削除すると、Spring mvcマッピングがIntellijによって再び検出されます(Ultimateバージョンでは、2018.1を使用しています)。また、thymeleafオブジェクトは現在機能しています。
これらのプロパティを使用して、更新によりthymeleafテンプレートファイルが再ロードされる高速開発をサポートしました。
この問題を解決するには、スプリングブートアプリケーションの実行構成で次の-Dオプションを使用して、開発中にプロパティファイルがある場所をスプリングブートに伝えます。
-Dspring.config.location=/dev/application/conf/application.properties
もう1つ興味深い状況があります。DONTをコントローラーから直接オブジェクトに戻す場合、Intellijは変数を認識しませんが、彼女はまだ動作します。