web-dev-qa-db-ja.com

IntelliJのSpringブート+ thymeleaf:変数を解決できません

私は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の問題ですか、それとも私のコードの問題ですか?

23
Shuhan Liu

これはIntelliJの問題です: IDEA-132738

基本的に、Spring Bootを使用してすべてを自動構成すると、IntelliJはモデル変数を見つけることができません。

15
Andrew
  1. IntelliJバージョンが<2017.3の場合、 Andrewが書いた のように、既知のエラー IDEA-132738 。 IDEでエラーマークを取り除く方法があります。 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"-->
  1. IntelliJのバージョンが2017.3以上の場合(ただし、まだ機能しないと不満を言う人もいます)、問題を修正する必要があります(@FloatOverflow: 「バージョン2017.3ビルド25.Oct.2017で問題が解決されたことを確認します」):

ステータス2017.3

Spring Boot自動構成MVCアプリケーションのサポートが完了し、バンドルされているすべての自動構成ビュータイプがサポートされます。

修正バージョン:2017.3

15
Honza Zidek

コードには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。を削除しました。

9

もう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";
}

したがって、必ずビュー関数内にコードを直接配置してください!

7
user7346048

Intellij 2018.1.6 Ultimate Editionで手動で有効にしました。続く手順

  1. プロジェクトツールウィンドウを開きます(例:[表示] | [ツールウィンドウ] | [プロジェクト])。

  2. プロジェクトまたはモジュールフォルダーを右クリックし、[フレームワークサポートの追加]を選択します。

  3. 開いた[フレームワークサポートの追加]ダイアログの左側のペインで、[Thymeleaf]チェックボックスを選択します。

公式リファレンス: https://www.jetbrains.com/help/idea/thymeleaf.html#0c8052be

2
xyz

私の場合、問題は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
Ekkelenkamp

もう1つ興味深い状況があります。DONTをコントローラーから直接オブジェクトに戻す場合、Intellijは変数を認識しませんが、彼女はまだ動作します。

0
Georgi Peev