Spring boot + thymeleaf в IntelliJ: невозможно разрешить vars

Я пишу короткое приложение для веб-форм, используя spring boot и thymeleaf на IntelliJ, но кажется, что в 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>

Всегда есть красные линии под заголовками "post", "title" и "content", но я не знаю, как их решить. Это проблема IntelliJ или просто проблема моего кода?

Ответ 1

Это проблема с IntelliJ: IDEA-132738.

В основном IntelliJ не может найти переменные модели, когда Spring Boot был использован для автоконфигурации всего.

Ответ 2

  1. Если ваша версия IntelliJ <2017.3, это, как писал Эндрю, известная ошибка IDEA-132738. Существует обходной путь, как избавиться от меток ошибок в IDE. IntelliJ также поддерживает полуавтоматическую генерацию приведенного ниже кода:

Вы можете использовать сочетание клавиш Alt + Enter, чтобы вызвать намерение "Объявить внешнюю переменную в аннотации комментария", чтобы избавиться от "неразрешенного атрибута модели" в ваших представлениях.

Добавьте следующий код в ваш html файл:

<!--/* Workaround for bug https://youtrack.jetbrains.com/issue/IDEA-132738 -->
    <[email protected] id="post" type="your.package.Post"-->
    <[email protected] id="title" type="String"-->
    <[email protected] id="content" type="String"-->
<!--*/-->

Если вы используете объекты расширений, созданные автоматически ThymeLeaf, такие как #temporals из thymeleaf-extras-java8time для преобразования объектов java.time:

<span th:text="${#temporals.format(person.birthDate,'yyyy-MM-dd')}"></span>

и IntelliJ не может их разрешить, использовать похожий код и просто добавить # перед именем объекта:

<[email protected] id="#temporals" type="org.thymeleaf.extras.java8time.expression.Temporals"-->
  1. Если ваша версия IntelliJ> = 2017.3 (однако некоторые люди жалуются, что она все еще не работает для них), проблема должна быть исправлена (@FloatOverflow: "Я подтверждаю, что в версии 2017.3 сборка 25. окт. 2017 проблема была решена "):

Статус 2017.3

Поддержка автоконфигурированных приложений MVC Spring Boot завершена, поддерживаются все связанные типы представлений автоконфигурации.

Версии исправлений: 2017.3

Ответ 3

Я хочу добавить еще одну вещь. Как указано выше, проблема была исправлена ​​в IntelliJ 2017.3. Я также могу подтвердить это.

Однако я заметил, что это верно только в том случае, если вы определяете все свои атрибуты напрямую внутри функции ответственного контроллера, например, например. это:

@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";
}

Итак, всегда убедитесь, что вы поместили свой код непосредственно в функцию просмотра!

Ответ 4

В моем случае проблема заключалась в том, что у меня было следующее в application.properties:

spring.thymeleaf.prefix=file:src/main/resources/templates/

spring.thymeleaf.cache=false

После того, как я удалил эти свойства, Intellij снова обнаруживает сопоставления Spring mvc (в Ultimate-версии я использую 2018.1). Также объекты из тимьяна работают сейчас.

Я использовал эти свойства для поддержки быстрой разработки, при которой обновление будет перезагружать файлы шаблона тимили.

Чтобы решить эту проблему, я использую следующую опцию -D в моей конфигурации запуска моего приложения весенней загрузки, чтобы сообщить весенней загрузке, где находятся мои файлы свойств во время разработки:

-Dspring.config.location=/dev/application/conf/application.properties

Ответ 5

Есть еще одна интересная ситуация: если вы НЕ возвращаете объект напрямую из вашего контроллера, Intellij не распознает переменную, но все равно будет работать

Ответ 6

Включив его вручную, я работал в Intellij 2018.1.6 Ultimate Edition. Шаги следовали

  1. Откройте окно инструмента Project (например, View | Tool Windows | Project).

  2. Щелкните правой кнопкой мыши проект или папку модуля и выберите "Добавить поддержку платформы".

  3. В левой части диалогового окна "Добавление поддержки фреймворка" установите флажок "Thymeleaf".

Официальная ссылка: https://www.jetbrains.com/help/idea/thymeleaf.html#0c8052be

Ответ 7

У меня было две разные части кода: первая показывала ошибку, а вторая не делала этого. Я заметил, что есть разница в атрибуте xmlns: th.

Первая страница: не работает!

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org">

Вторая страница: работает!

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://thymeleaf.org">

Я удалил www. и это работает для меня!

Ответ 8

Эта функция поддерживается только в версии Ultimate.

Нажмите здесь для более подробной информации