Spring boot + thymeleaf in IntelliJ: 無法解析 vars更新原始答案先决条件IntelliJ 版本 > = 2017.3IntelliJ 版本 < 2017.3

2022-09-01 02:48:55

我正在 IntelliJ 上使用 spring boot 和 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;
    }
}

然后是索引.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的问题还是我的代码的问题?


答案 1

更新

TL;DR:跳到下面接受的答案:https://stackoverflow.com/a/44804086/474034

正如多人在评论中提到的,这个解决方案是不正确的。Thymeleaf 文档(参见 http://thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html)在其所有示例中都有一个版本,其中包含:www.

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

另请参阅Github上的Standard-Dialect.xml,它声明为:namespace-uri

namespace-uri="http://www.thymeleaf.org" 

原始答案

我有两个不同的代码部分:第一个是显示错误,第二个不是这样做。我观察到 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.,它对我有用!


答案 2

先决条件

  • 安装了百里香叶插件

  • 该元素具有设置为 (with ) 的 XML 命名空间声明,例如:htmlthhttp://www.thymeleaf.orgwww.

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

IntelliJ 版本 > = 2017.3

检测应自动工作。但是,有些人抱怨它仍然不适合他们),问题IDEA-132738应该得到解决(@FloatOverflow:“我确认在版本2017.3 build 25.Oct.2017中问题已经解决”):

状态 2017.3

支持Spring Boot自动配置的MVC应用程序,支持所有捆绑的自动配置视图类型。

修补程序版本:2017.3

如果未自动检测到变量,您仍然可以添加注释,如下所示。@thymesVar

IntelliJ 版本 < 2017.3

正如安德鲁所写,这是一个已知的错误IDEA-132738。有一种解决方法可以解决方法,例如如何消除 IDE 中的错误标记。IntelliJ还支持半自动生成以下提到的代码:

您可以使用 + 快捷方式调用意图“在注释注释中声明外部变量”,以摆脱视图中的“未解析的模型属性”。AltEnter

将以下代码添加到您的文件中: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"-->
<!--*/-->

如果使用由 ThymeLeaf 自动构造的扩展对象,例如 from 用于对象转换:#temporalsthymeleaf-extras-java8timejava.time

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

和 IntelliJ 无法解析它们,使用类似的代码,只是在对象名称前面添加:#

<!--@thymesVar id="#temporals" type="org.thymeleaf.extras.java8time.expression.Temporals"-->

推荐